gpt4 book ai didi

C#树节点类设计

转载 作者:行者123 更新时间:2023-11-30 20:40:06 25 4
gpt4 key购买 nike

我正在寻找有关如何组织分层树节点类的建议。

我有一个分层树,其中包含一些与树相关的成员,例如 ParentChildrenAddNode()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() { }
}

在不同的类中拆分树节点和节点值:

1) 只包含树相关成员的树节点类;

2) 仅包含特定于值的成员的节点值类,并通过节点对象中的 Value 成员引用此对象。

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() { }
}

我的具体场景的一些细节:

  1. 节点值类应该有大约 15 个轻量级属性(它们是 intbyteboolstring 类型)和 5-10 种方法。
  2. 截至目前,节点值不应该与其树节点对话,因此不需要节点值交叉引用。然而,树节点对象将与节点值对话(通过第二个设计中的 Value 属性)。

我打赌这两种情况都是有效的(因为它们在许多文章中被广泛使用),所以问题是:

  1. 是否首选这些设计?
  2. 如果没有,那么在选择之前我应该​​考虑哪些因素?

最佳答案

我会分开关注点。树的关注点是在修改下维护树不变量。每个节点中数据的关注点是,无论它关注什么。

我要做的是制作一个通用容器类型 Tree<T>并让树对它的值一无所知,并且这些值对它们所在的树一无所知

现在,有些情况下树必须知道一些值。例如,假设您正在构建一个权重平衡的二叉树,而不是您在此处构建的 n 叉树。权重平衡的二叉树必须能够查询节点以找出它们的“重量”如何以产生可接受的平衡。有几种方法可以做到这一点。一种方法是要求 T实现一些IWeight界面。另一种方法是要求树的创建者提供 Func<T, double>代表可以产生 T 的权重.无论哪种方式,树只知道它为完成其工​​作所需的节点信息:维护树不变量。

关于C#树节点类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33719516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com