【发布时间】:2010-08-14 20:18:20
【问题描述】:
我有一个树结构设计问题,我想不出出路。
我想要一个包含通用数据的类 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 的人,我不能对 ComplexTree 使用 Iterate,因为我不能使用属于的 cv1、cv2 值只对继承树。
我缺少一个明显的解决方案吗? 我不应该使用继承吗? 应该重写所有方法吗?
谢谢, 约翰
【问题讨论】:
-
显而易见的问题:如果要添加要存储在每个节点中的值,为什么不将 TData 声明为具有一些属性的小类?
-
我要补充一点,
DoComplexStuffOnTree不一定是Tree或其任何子级的方法。这是一种与树的实现正交的算法。 -
Stevem 已经说过了,但是定义了包含这两个复杂值的类 ComplexData,然后定义了 ComplexTree : Tree
以便 TData 变为 ComplexTree - 然后你可以调用 Iterate 或基础上的任何东西并且它可以工作很好 -
是的,我同意我想添加的所有方法都是算法,但我们都同意树中的每个节点本身就是树的根,所以我想能够使用 tree.DoSomething 而不是算法.DoSomthing(tree)。但这让我想知道为什么我应该从 tree 继承,因为所有方法都在复杂树的算法类中......我仍然不确定/不相信。
标签: c# design-patterns oop tree