我编写了以下类来创建树形树,但是由于所有节点类都包含类型为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