我有一个树形结构设计问题,我想不出办法。
我希望有一个包含通用数据的类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的人,并且我不能使用Iterate作为ComplexTree,因为我不能使用属于的cv1,cv2值仅限于继承树。
我有一个明显的解决方案吗? 我不应该使用继承吗? 应该重写所有方法吗?
谢谢, 约翰
答案 0 :(得分:1)
如果不知道您需要树形结构的实际用例,很难回答您的问题,但总的来说,我会赞同评论中提出的建议:
声明包含两个整数的类ComplexData
,并将ComplexTree
声明为Tree<ComplexData>
的子类。
您甚至可以声明ComplexData<TData>
本身是通用的,因此它可以包含额外的TData
,然后将ComplexTree<TData>
声明为Tree<ComplexData<TData>>
的子类。
您需要明确代码合同以了解运行算法的方法 - 即实际应该采用的方法是什么,一般/抽象术语,而不是一个特定的用例。如果合同是它返回TData
个对象的集合,那么显然它应该做什么,无论你是在一个简单的树或子类上运行它。如果契约更抽象并且行为应该依赖于子类,那么它可能应该是子类可以覆盖的虚方法(或使用受保护的虚方法)。