我编写了以下类来创建树 - 层次结构,但由于所有节点类都包含类型为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也有该列表。
答案 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