繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM