C#树节点类设计

C#树节点类设计,c#,tree,C#,Tree,我正在寻找一些关于如何组织层次树节点类的建议 我有一个层次结构树,其中包含一些与树相关的成员,如父节点,子节点,添加节点(),RemoveNode(),等等。每个节点也使用特定于应用程序的数据。在阅读了大量文章后,我得出了两种可能的设计: 在单个树节点类中将树相关成员与节点值成员组合: public class TreeNodeClass { // tree-specific members public TreeNodeClass Parent { get; set; }

我正在寻找一些关于如何组织层次树节点类的建议

我有一个层次结构树,其中包含一些与树相关的成员,如
父节点
子节点
添加节点()
RemoveNode()
,等等。每个节点也使用特定于应用程序的数据。在阅读了大量文章后,我得出了两种可能的设计:

在单个树节点类中将树相关成员与节点值成员组合:

public class TreeNodeClass {
    // tree-specific members
    public TreeNodeClass Parent { get; set; }
    public IList<TreeNodeClass> Children { get; set; }
    public void AddNode() { }
    public void RemoveNode() { }
    public IEnumerable<TreeNodeClass> Traverse() { }
    <...>
    // value-specific members
    public Type1 ValueSpecificProperty1 { get; set; }
    <...>
    public TypeN ValueSpecificPropertyN { get; set; }
    public void Method1() { }
    <...>
    public void MethodN() { }
}
我的特定场景的一些细节:

  • 节点值类应该有大约15个轻量级属性(它们是
    int
    byte
    bool
    string
    类型)和5-10个方法
  • 到目前为止,节点值不应该与其树节点对话,因此不需要节点值交叉引用。但是,树节点对象将与节点值对话(在第二种设计中通过
    value
    属性)
  • 我打赌这两种情况都是有效的(因为它们在许多文章中被广泛使用),所以问题是:

  • 这些设计中有哪一个是首选的
  • 如果没有,那么在选择之前我应该考虑哪些因素

  • 我会分开考虑。树关注的是在修改下保持树不变量。每个节点中数据的关注点是,不管它的关注点是什么

    我要做的是创建一个通用容器类型
    Tree
    ,使树不知道它的值,而这些值不知道它们所在的树


    现在,有些情况下,树必须知道一些关于值的信息。例如,假设您构建的不是n元树,而是一个权重平衡的二叉树。权重平衡的二叉树必须能够查询节点,找出它们的“权重”以产生可接受的平衡。有几种方法可以做到这一点。一种方法是要求
    T
    实现一些
    IWeight
    接口。另一种方法是要求树的创建者提供一个
    Func
    委托,该委托可以产生
    T
    的权重。不管是哪种方式,树只知道它完成工作所需的关于节点的信息:维护树不变量。

    这两种方法几乎没有什么不同。当节点值包含多个项时,应使用第二种方法。不确定您的TreeNodeClass为什么不继承Net library TreeNode类。因为:1)我必须重写
    添加
    删除
    插入
    方法。为了修改树,我必须执行很多操作(它们是特定于应用程序的)。2) 这是一个框架库,可以在有或没有GUI的应用程序中使用。此外,可能有基于WinForms或WPF(或其他)的GUI。它们有不同的
    TreeNode
    类。问题仍然是节点是单个值(第一个设计)还是多个值(第二个设计)?看起来您的场景是多个项目(15个轻量级属性),这意味着您需要第二个设计。现在您是否需要一个特殊的添加、删除、插入方法来支持多个项目?
    Add
    Remove
    Insert
    方法用于管理树本身(添加、删除、插入节点),而不是值。问题不在于它们:我应该将树节点与节点值(一组属性和方法)分开,还是最好将所有内容组合在同一个类中。您可能会感激地了解到
    Child
    的复数形式是
    Children
    。我的树不是二进制的,它在单个节点下可能有0..MAX子元素。关于
    ,你的意思是这样的:?@CryptoGuy:我知道你在构建一棵n元树。我的加权树示例表明,在某些情况下,树不变量依赖于节点的事实;他们不一定是独立的。我的观点是,如果存在依赖项,您应该使依赖项尽可能小,并以特定的方式捕获,如接口或委托。@CryptoGuy:就链接页面中的树而言,我已经阅读了第一行代码,我已经不喜欢它了。使用奇怪的循环模板模式的C#风格并不是制作树数据结构所必需的。如果我在我引用的链接中实现类似的东西,可以吗?@CryptoGuy:当然可以。链接文章中的想法非常好;我不同意一些设计决策,但基本想法是正确的。我将从一个比这里描述的树更简单、与WPF联系更少的东西开始。
    public class TreeNodeClass {
        public TreeNodeClass Parent { get; set; }
        public IList<TreeNodeClass> Children { get; set; }
        public TreeNodeValue Value { get; set; }
        public void AddNode() { }
        public void RemoveNode() { }
        public IEnumerable<TreeNodeClass> Traverse() { }
        <...>
    }
    public class TreeNodeValue {
        public Type1 ValueSpecificProperty1 { get; set; }
        <...>
        public TypeN ValueSpecificPropertyN { get; set; }
        public void Method1() { }
        <...>
        public void MethodN() { }
    }