【问题标题】:Tree Data Structure OOP Design Problem (C#)树数据结构 OOP 设计问题 (C#)
【发布时间】: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


【解决方案1】:

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

  • 声明一个包含两个整数的类ComplexData,并将ComplexTree声明为Tree&lt;ComplexData&gt;的子类。

  • 您甚至可以将ComplexData&lt;TData&gt; 本身声明为泛型,以便它可以包含额外的TData,然后将ComplexTree&lt;TData&gt; 声明为Tree&lt;ComplexData&lt;TData&gt;&gt; 的子类。

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

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2010-11-27
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多