我编写了以下类来创建树形树,但是由于所有节点类都包含类型为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 -class中,因为NodeBase没有Children -list,并且将Children放在其中,将导致LeafNode也具有清单。

最佳答案

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

乍一看,这似乎有点像循环依赖,但那里没有真正的问题。因此,当您需要(想要)对派生节点的特殊类型的引用时,您可以并且应该对其进行精确建模。比使用更通用的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

10-08 00:15