Kel*_*sie 8 c# oop inheritance
我有一个类别/文件树结构.类别和文件都可以包含父类,因此我从具有Parent属性的公共基类派生它们.由于所有父项显然都是类别(文件不能是父类),因此将节点的Parent属性设置为CategoryNode类似似乎是有意义的.
基类引用派生类是不好的形式?如果是这样,为什么?如果是这样的话,有什么更好的方法呢?
class Node {
public CategoryNode Parent {get; set;}
}
class File : Node {
...
}
class CategoryNode : Node {
...
}
Run Code Online (Sandbox Code Playgroud)
你可以......
interface IParent {
...
}
class Node {
public IParent Parent {get; set;}
}
class File : Node {
...
}
class CategoryNode : Node, IParent {
...
}
Run Code Online (Sandbox Code Playgroud)
这样,您就不需要在基类中引用派生对象,而且,如果您在以后获得其他对象类型,则您可以更灵活地实际成为父对象.此外,可以在该接口中声明与父级相关的任何功能.
如果该属性实际上Parent是所有后代的公共属性并且始终属于 CategoryNode 类型,那么这不是问题。从语义上讲,它是正确的,从技术上讲,我认为只要您留在同一个库中(以避免循环引用),它也是正确的。
当您编写如下代码时,这可能会出现问题:
// BAD CODE
if(myProp is subclassA)
{ ...
}
else if (myProp is syubclassB)
{ ...
}
Run Code Online (Sandbox Code Playgroud)
这段代码很糟糕,因为你失去了继承的优势。
即使在 .Net Framework 中也存在这样的构造。我想到的第一个例子是XObject.Parent属性。
XElement 继承 XObject,并且 XObject 发布 XElement 类型的属性。和你的片段一样。