【发布时间】:2016-02-16 14:45:39
【问题描述】:
我正在寻找一些关于如何组织分层树节点类的建议。
我有一个分层树,其中包含一些与树相关的成员,例如Parent、Children、AddNode()、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() { }
}
我的具体场景的一些细节:
- 节点值类应该有大约15个轻量级属性(它们是
int、byte、bool和string类型)和5-10个方法。 - 到目前为止,节点值不应该与其树节点对话,因此不需要节点值交叉引用。但是,树节点对象将与节点值对话(通过第二个设计中的
Value属性)。
我敢打赌,这两种情况都是有效的(因为它们在许多文章中被广泛使用),所以问题是:
- 是否首选这些设计?
- 如果不是,那么在选择之前我应该考虑哪些因素?
【问题讨论】:
-
两种方法之间几乎没有什么不同。当节点值包含多个项目时,应使用第二种方法。不知道为什么你的 TreeNodeClass 不继承 Net 库 TreeNode 类。
-
因为:1) 我必须重写
Add、Remove、Insert方法。为了修改树,我必须执行很多事情(它们是特定于应用程序的)。 2) 这是一个框架库,可以在有和没有 GUI 的应用程序中使用。此外,可能还有基于 WinForms 或 WPF(或其他)的 GUI。他们有不同的TreeNode类。 -
问题仍然是您的节点是单个值(第一个设计)还是多个值(第二个设计)?看起来您的场景是多个项目(15 个轻量级属性),这意味着您需要第二个设计。现在你需要一个特殊的 Add、Remove、Insert 方法来支持你的多个项目吗?
-
Add,Remove,Insert方法用于管理树本身(添加、删除、插入节点),而不是值。问题不在于它们:我应该将树节点与节点值(这是一堆属性和方法)分开,还是将所有内容组合在同一个类中。 -
知道
Child的复数形式是Children,您可能会感激不尽。