在基类型中引用派生类型是不好的形式?

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)

tak*_*krl 7

你可以......

interface IParent {
    ...
}

class Node {
    public IParent Parent {get; set;}
}

class File : Node {
    ...
}

class CategoryNode : Node, IParent {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样,您就不需要在基类中引用派生对象,而且,如果您在以后获得其他对象类型,则您可以更灵活地实际成为父对象.此外,可以在该接口中声明与父级相关的任何功能.


Ste*_*e B 4

如果该属性实际上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 类型的属性。和你的片段一样。