【发布时间】:2011-08-28 02:22:31
【问题描述】:
我有 2 组 2 个类,其中每对具有超类/子类关系,正交对具有依赖关系。我要确定的是如何处理构造函数和/或属性的主体,以使模型尽可能简单,数据重复最少。
代码结构如下:
public class Base1 {
public List<Base2> MyBase2Things { get; set; }
// Do things with Base2 objects
}
public class Sub1 : Base1 {
public List<Sub2> MySub2Things { get; set; }
// Do things with Sub2 objects and also with Base2 objects
}
public class Base2 {
public Base1 MyBase1 { get; set; }
// Do things with the Base1 object
}
public class Sub2 : Base2 {
public Sub1 MySub1 { get; set; }
// Do things with the Sub1 object
}
我考虑过覆盖子类中的基本属性,但这不太适合,因为子类中的属性没有相同的签名,所以我必须添加属性。
我也考虑过在子类构造函数和set方法中设置基属性,但是如果基类的属性更新了,子类属性就没有办法更新了。
还有哪些其他选项,哪个最干净(以及为什么)?
注意:上面的代码为了说明问题做了很大的简化。真正的类有额外的属性和方法,但这个子集是我遇到的问题的本质。
【问题讨论】:
-
我认为简单的答案是你不能。在 .Net 4.0 中,协方差对您有所帮助,但是……希望我错了。 stackoverflow.com/questions/245607/…
-
@Jodrell - 好的,所以如果由于 CLR 和安全问题施加的限制,我不能像我希望的那样干净利落,那么我能做的下一个最好的事情是最大限度地减少数据重复并确保数据完整性,同时仍遵循良好的设计最佳实践?
-
了解您要完成的工作会有所帮助。 Liskov 替换原则说任何适用于 Base1 的方法都应该适用于 Sub1,并且由于您有不同的列表,因此这是不正确的。无论如何,我会避免公开你的名单。你可以通过显式的 Add/Remove/Get 方法来解决它吗?
-
@NerdFury - Sub1 需要处理特定于 Sub2 的事情,但 Base1 只需要处理 Base2 的事情。由于 Sub1 和 Sub2 是子类,它们从父类继承列表,因此不会违反 Liskov 替换。我同意公开列表有点臭,但这不是主要问题。但是,我认为 Add/Remove/Get 方法可能是正确的方法。
-
“并行继承结构”在当时看起来总是很好,但他们迟早会咬我!
标签: c# inheritance subclass