树数据结构OOP设计问题(C#)

时间:2010-08-14 20:18:20

标签: c# design-patterns oop tree

我有一个树形结构设计问题,我想不出办法。

我希望有一个包含通用数据的类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值仅限于继承树。

我有一个明显的解决方案吗? 我不应该使用继承吗? 应该重写所有方法吗?

谢谢, 约翰

1 个答案:

答案 0 :(得分:1)

如果不知道您需要树形结构的实际用例,很难回答您的问题,但总的来说,我会赞同评论中提出的建议:

  • 声明包含两个整数的类ComplexData,并将ComplexTree声明为Tree<ComplexData>的子类。

  • 您甚至可以声明ComplexData<TData>本身是通用的,因此它可以包含额外的TData,然后将ComplexTree<TData>声明为Tree<ComplexData<TData>>的子类。

  • 您需要明确代码合同以了解运行算法的方法 - 即实际应该采用的方法是什么,一般/抽象术语,而不是一个特定的用例。如果合同是它返回TData个对象的集合,那么显然它应该做什么,无论你是在一个简单的树或子类上运行它。如果契约更抽象并且行为应该依赖于子类,那么它可能应该是子类可以覆盖的虚方法(或使用受保护的虚方法)。