我正在处理一个项目,该项目处理从数据库中检索到的大量不同类型的对象。为了进一步考虑,我们假设我们有一个更简单的结构如下(为简单起见,访问修饰符等等):
class Outer {
Mid mid;
string someString;
void createMid(string str) {
// some work
this.mid = new Mid(str);
}
}
class Mid {
Inner inner;
string someOtherString;
}
class Inner {
string innerString;
}
class Inner2 : Inner {
// some custom behaviour for innerString
}
现在我们创建一个Outer
实例,它也实例化它的嵌套对象。现在我们想通过对它进行子类化来改变Inner
- 类中的一些行为(假设我们要将其innerString
- 属性设置为与其基础实现中的某个不同的值)。我目前的做法是继承Inner
。要创建此派生类的实例,我们还必须继承Mid
,我们也将Outer
子类化。虽然创建这个嵌套结构包含Outer
- 对象中的许多操作,但我们也应该覆盖我们的大部分代码,只是实例化Inner2
- 实例,因此也是Mid
的另一个实例。
我知道这听起来像是一个巨大的设计缺陷但是我没有为这种设计找到任何其他解决方案,而不是为整个结构创建子类并覆盖整个createMid
- 方法只是为了这个相对较小的子-宾语。
是否有任何其他方法可以继承Inner
而不进行所有其他的子类化?
答案 0 :(得分:2)
使用工厂模式:而不是直接在Inner
内实例化Mid
,请致电:
this.mid = InnerFactory.Create(/*parameters*/);
然后 InnerFactory
可以创建Inner
或Inner2
,具体取决于参数。
可能有点棘手的是提供参数,以便工厂可以决定实例化哪个类。