具有多个集合的容器类的设计实践,这些集合相互引用

时间:2012-03-20 04:20:57

标签: c# class collections

我正在尝试使用以下内容设计类结构:

  • 容器类,其中包含所有项目。
  • 项目集合类位于Container内部,其中每个Item都有唯一的ID和一些其他数据,包括对ItemStyle的引用。
  • ItemStyle 集合类位于Container内,其中每个ItemStyle代表一种常见的项目样式以及与其他样式的关系。

关系可以是“附加到”,其中样式具有可附加到的其他样式的列表,以及与其相反的“附件”。如果某个样式可以“附加到”另一个样式,那么另一个样式应该能够将第一个样式生成为其“附件”之一。

容器管理Items和ItemStyles。我为所有内容使用唯一ID,因为我希望能够在XML之间进行序列化。

但是我一直遇到逻辑问题,例如我试图从XML反序列化ItemStyle,但当然它不能生成对它读取的项ID的引用,因为只有Container本身可以访问其他项。

另一个问题是我希望这些类独立于如果我有一个Item的引用,我可以调用兼容项的列表,例如调用“Item.Attachments”或“Item.AttachesTo”。这当然都需要由Container计算,因为它是唯一能够访问ItemStyles和Item集合的类。

所以我遇到了一个解决方案,我必须给每个Item和ItemStyle一个对Container的引用,这样他们就可以执行自己的查找并确定它们与其他项的关系。这似乎是糟糕的封装和糟糕的OOP实践,但我想不出任何其他方式。

我正在尝试将我的代码与ListView的工作方式进行比较。 ListView有一个ListViewItemCollection和ListViewItems。在用户代码中,当您可以创建新的ListViewItem时,当您将其添加到ListViewItemCollection时,它现在自动具有对其父ListView的引用。在查看元数据时,它将ListView引用显示为仅具有getter。我可以假设它使用内部集吗?

是否应遵循所有者/项目关系的ListView模型与我的类一起工作?

1 个答案:

答案 0 :(得分:2)

考虑所涉及的所有类之间的紧密耦合,我不认为引用父(Container)会是一个坏主意。有许多模型依赖于父引用(典型的原因可能是确保单个父代,但其他原因,如验证等可能是一个原因) - 模型的一种方法是通过非公共构造函数和构造对象工厂方法。另一种建模方法是使用公共构造函数,但使用内部setter来设置父引用。只要将子项添加到父项的集合对象中,就会设置引用。

我更喜欢后来的方法。但是,我要做的一件事就是避免与Container直接耦合。相反,我将介绍IContainer接口,它将抽象儿童和儿童所需的查找(Item / ItemStyle)只知道IContainer接口。

另一个合理的设计是在儿童想要进行查看时提出事件。这些内容事件将在将子项添加到容器时由容器处理。

另一种方法是拥有一个松散的模型。从本质上讲,Item可以维护自己的ItemStyle引用。只要需要,Container就可以通过实现访问者模式来构建ItemStyle集合。