代码之家  ›  专栏  ›  技术社区  ›  Russ Cam

包含多种类型的C#2.0泛型树

c#
  •  2
  • Russ Cam  · 技术社区  · 15 年前

    在研究如何最好地解决这个特殊问题时,我遇到了一个棘手的问题,我真的希望得到专家社区的一些指导!

    假设我有三节课

    Branch
    Twig
    Leaf
    

    A. Branch 可以包含其他 对象,但也可以包含 Twig 对象和 Leaf 物体。

    A. 可以包含其他 细枝 对象,但也可以包含 物体。

    叶子 对象可以被视为基本组件,不包含任何其他对象的集合。

    因此,可能的结构是

    分支机构

    Branch                Branch                  Branch
    |                     |                       |
    |_Branch              |_Twig                  |_Leaf
    |  |_etc...           |  |_etc...
    |                     |
    |_Twig                |_Leaf
    |  |_etc...
    |
    |_Leaf
    

    细枝

    Twig                  Twig
    |                     |
    |_Twig                |_Leaf
    |  |_etc...
    |
    |_Leaf
    

    叶子

    Leaf
    

    分支机构 ,我希望能审问任何后代 分支机构 细枝 叶子 对象和知识

    1. 叶子 UnderSide 财产价值 "Furry"

    3.通过对象一次枚举一个子级,即所有第一个子级的有序列表,然后是所有第二个子级,等等(每个级别中对象的顺序无关紧要)。

    1. 按广度枚举对象,即第一个子对象的有序列表,如果第一个子对象有子对象,则第一个子对象的子对象,如果该对象有子对象,则该对象的子对象…然后第二个子对象,等等。。。

    我的第一个想法是使用泛型树和接口多态性,但我在解决细节方面遇到了困难- 叶子 对象是非常不同的。如果我只处理一种类型的对象,它将非常简单!是否可以以类型安全的方式执行此操作?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Mark Synowiec    15 年前

    我会使用接口来指示谁可以持有什么:

    public interface IBranch { }
    public interface ITwig { }
    
    public class Branch : IBranch
    {
        List<IBranch> _Kids = new List<IBranch>();
        public List<IBranch> Kids
        {
            get { return _Kids; }
        }
    }
    
    public class Twig : ITwig, IBranch
    {
        List<ITwig> _Kids;
        public List<ITwig> Kids
        {
            get { return _Kids; }
        }
    }
    
    public class Leaf : ITwig, IBranch
    {
    }
    

    实现ienumerable,并确保在枚举子项之前“返回this”。最好将所有公共功能放在IBranch中,并将叶子和细枝之间的公共性放在ITwig中。

        2
  •  1
  •   Colin    15 年前

    它们确实都共享Ratio属性,但不是吗,所以你至少可以让它们都实现一些IRatio接口。。。

        3
  •  1
  •   Justin Drury    15 年前

    public interface INodeChild
    {
        public INodeParent Parent {get;set;}
        //Any methods/properties common to ALL inheritors
    }
    
    public abstract class NodeParent : INodeChild
    {
        public INodeParent Parent {get; protected set;}
    
        public IList<INodeChild> Children {get;set;}
        // This is just breadth-wise since I'm more familiar with that.
        public string ListChildren(int level)
        {
            StringBuilder sb = new StringBuilder();
            foreach(INodeChild item in Children)
            {
                sb.AppendLine(Enumerable.Repeat(" ", level));
                INodeParent itemParent = item as INodeParent;
                if(itemParent != null)
                {
                    itemParent.ListChildren(++level);
                }
            }
            return sb.ToString();
        }
        //Any methods/properties common to all parent inheritors (brach/twig/etc)
    }
    
    public class Brach : NodeParent
    {
        // Any branch only stuff goes here.
    }
    
    public class Twig : NodeParent
    {
        // Any twig only stuff goes here
    }
    
    public class Leaf : INodeChild
    {
        // Any leaf only stuff goes here.
    }