我正在尝试使用以下内容设计类结构:
关系可以是“附加到”,其中样式具有可附加到的其他样式的列表,以及与其相反的“附件”。如果某个样式可以“附加到”另一个样式,那么另一个样式应该能够将第一个样式生成为其“附件”之一。
容器管理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模型与我的类一起工作?
答案 0 :(得分:2)
考虑所涉及的所有类之间的紧密耦合,我不认为引用父(Container)会是一个坏主意。有许多模型依赖于父引用(典型的原因可能是确保单个父代,但其他原因,如验证等可能是一个原因) - 模型的一种方法是通过非公共构造函数和构造对象工厂方法。另一种建模方法是使用公共构造函数,但使用内部setter来设置父引用。只要将子项添加到父项的集合对象中,就会设置引用。
我更喜欢后来的方法。但是,我要做的一件事就是避免与Container直接耦合。相反,我将介绍IContainer
接口,它将抽象儿童和儿童所需的查找(Item / ItemStyle)只知道IContainer
接口。
另一个合理的设计是在儿童想要进行查看时提出事件。这些内容事件将在将子项添加到容器时由容器处理。
另一种方法是拥有一个松散的模型。从本质上讲,Item
可以维护自己的ItemStyle
引用。只要需要,Container就可以通过实现访问者模式来构建ItemStyle集合。