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() { }
}
我的特定场景的一些细节:
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() { }
}