[英]Tree Data Structure OOP Design Problem (C#)
我有一个树结构设计问题,我想不出办法。
我想要一个包含通用数据的类Tree,并用ComplexTree扩展Tree类,该类将包含更多方法,如Iterate,DoSomthingOnComplex等。
这是我有的代码示例:
class Tree<TData>
{
public TData Data { get; set; }
public ICollection<Tree<TData>> Children { get; private set; }
public Tree<Data>(TData data)
{
// ...
}
public void Iterate(Action<TData> action)
{
action(Data);
Children.ForEach(x => x.Iterate(action));
}
}
class ComplexTree<TData> : Tree<TData>
{
public int ComplexValue1 { get; set; }
public int ComplexValue2 { get; set; }
public ComplexTree(TData data, int cv1, int cv2)
: base(data)
{
// ...
}
public void DoComplexStuffOnTree()
{
// ... might want to use the base methods here
}
}
问题是,一件事,我无法真正将拥有Tree的集合暴露给创建了ComplexTree的任何人,并且我无法对ItericTree使用Iterate,因为我无法使用仅属于该属性的cv1,cv2值继承树。
有什么明显的解决方案我不见了吗? 我不应该使用继承吗? 应该重写所有方法吗?
谢谢,约翰
在不知道需要树形结构的实际用例的情况下很难回答您的问题,但是总的来说,我会支持注释中的建议:
声明一个类ComplexData
包含您的两个整数和声明ComplexTree
作为一个子类Tree<ComplexData>
您甚至可以声明ComplexData<TData>
本身是通用的,因此它可以包含一个附加的TData
,然后将ComplexTree<TData>
声明为Tree<ComplexData<TData>>
的子类。
您需要在代码协定中明确说明运行算法的方法-即,一般而言,该方法实际上应该做什么,而不是针对特定用例。 如果约定是返回TData
对象的集合,那么显然这是它应该做的, 而不管是在简单树还是在子类上运行它。 如果协定更抽象,并且行为应取决于子类,则可能应该是子类可以覆盖的虚拟方法(或使用受保护的虚拟方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.