基类是否可以包含对其子类之一的引用?

时间:2015-05-12 17:53:11

标签: c# coding-style

我编写了以下类来创建树 - 层次结构,但由于所有节点类都包含类型为ParentNode的父节点,所以我想将它移到基类中,所以我没有为所有节点类型重写与父节点相关的任何代码。所以,虽然它显然有效,但在ParentNode - 类中有一个NodeBase类型的字段会被认为是不好的做法,如果是这样,什么是"正确"解决这个问题的方法是什么?

public abstract class NodeBase{
    /*Various general methods and properties*/
}
public class ParentNode : NodeBase{
    public readonly ParentNode Parent;
    public readonly List<NodeBase> Children;

    /*Methods etc related to parent nodes*/
}
public class LeafNode : NodeBase{
    public readonly ParentNode Parent;

    /*Methods etc related to leaf nodes*/
}

我不能在public readonly NodeBase Parent - 类中加NodeBase,因为NodeBase没有Children - 列表,并放Children 1}},会导致LeafNode s也有该列表。

2 个答案:

答案 0 :(得分:3)

虽然我不认为这是不好的做法,但它会告诉我,我设计的是错误的。

一般来说,在超类中保留子类的引用没有任何意义。

在这种情况下,我不明白为什么你需要为叶节点和父节点设置一个单独的类。所有节点都可以有子节点和父节点。作为叶子节点只是没有子节点的结果,任何只影响叶子节点的方法只能检查列表的计数以确认没有子节点。就像任何RootNode检查一样,查看父节点。

答案 1 :(得分:3)

这种模式经常使用,没有任何问题。

乍一看,它看起来有点像循环依赖,但那里没有真正的问题。因此,当您需要(想要)对特殊类型的派生节点的引用时,您可以并且应该准确地对其进行建模。比使用更通用的NodeBase Parent {get; set;}更好更安全,然后使用类型转换和额外检查。

这很常见,例如XObject类:

class XObject
{
   public XElement Parent { get; }
   public XDocument Document { get; }
}

class XElement  : XObject { ... }   // with a few classes 
class XDocument : XObject { ... }   //    in between