如何使用泛型编写真正通用的树

log*_*cnp 2 .net c# generics

假设我有一个Node类,如下所示:

    class Node<T>
    {
        T data;
        List<Node<T>> children;
        internal Node(T data)
        {
            this.data = data;
        }

        List<Node<T>> Children
        {
            get
            {
                if (children == null)
                    children = new List<Node<T>>(1);

                return children;
            }
        }

        internal IEnumerable<Node<T>> GetChildren()
        {
            return children;
        }

        internal bool HasChildren
        {
            get
            {
                return children != null;
            }
        }

        internal T Data
        {
            get
            {
                return data;
            }
        }



        internal void AddChild(Node<T> child)
        {
            this.Children.Add(child);
        }

        internal void AddChild(T child)
        {
            this.Children.Add(new Node<T>(child));
        }

    }
Run Code Online (Sandbox Code Playgroud)

问题是树的每个节点都被限制在一个类型中.但是,在某些情况下,根节点属于一种类型,其中包含具有第三种类型子节点的另一种类型的子节点(示例文档 - >段落 - >行 - >单词).

如何为这种情况定义通用树?

Gra*_*meF 8

如果你想要一个严格的类型层次结构,你可以像这样声明它们:

class Node<T, TChild> {...}

Node<Document, Node<Paragraph, Node<Line, Word>>>
Run Code Online (Sandbox Code Playgroud)

我没有声称它会很漂亮.:)


Eri*_*ert 8

如何为这种情况定义通用树?

我不会试图在第一时间.如果我想建模的是:

  • 我有一份文件清单
  • 文档有一个段落列表
  • 段落有一个单词列表

那为什么你需要通用节点呢?创建一个类段落,它有一个List<Word>类,一个类文档有一个List<Paragraph>,然后创建一个List<Document>,你就完成了.为什么需要人为地施加通用树结构?买你有什么好处?