我现在正在重构一些代码。我有两个 - 多数是多余的 - 单位,每个产品一个。两者都包含一个继承少数子类的基类。这些也继承了更多的子类。
现在我想要合并两个单元,这样冗余代码就不再冗余,不同的部分分别在两个不同的单元中实现。
我首先想到了一些类似下面的例子:
BaseClass
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
Product<A>BaseClass Product<B>BaseClass
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
X
/|\
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
SubClass<1> SubClass<2> SubClass<3>
/ \ |
/ \ |
/ \ |
/ \ |
/ \ |
/ \ |
/ \ |
SubClass<1.1> SubClass<1.2> SubClass<3.1>
但问题是X
,其中继承在特定于产品的类下面加入,因为在Delphi语言中这种继承是不可能的。
所以,我认为必须有一个设计模式,这对于使用公共父类和公共后代类来实现这样的模型是有用的吗?
答案 0 :(得分:3)
现在我想要合并两个单元,这样冗余代码就不再冗余,不同的部分分别在两个不同的单元中实现。
如果A
和B
来自BaseClass
并且每个人仍然拥有某些(您的X),那么您应该意识到某事应该是BaseClass
的一部分。这是你的解决方案,它真的很简单。
如果A
和B
将执行委托给外部代码(包含事件,回调例程等等),这些代码恰好是每个代码的相同代码,在不知不觉中,那就是细
答案 1 :(得分:1)
没有看到你的实际课程,也不知道你想要达到什么目标,很难给出答案,因为有很多考虑因素。
不可能像C ++那样真正的多重继承。您可以使用接口执行类似的操作,但这似乎不合适,因为您没有指出任何类仅从A或B派生,因此如果您实现它们,则无论如何都必须将所有实际的函数定义移动到X. / p>
但X是什么?从逻辑上考虑它。如果A是水果而B是圆形而X是橙色,那么NGLN表示你需要将A和B合并为X,(或BaseClass)并抛弃A和B.
另一方面,如果是A,比如汽油坦克,B大灯和X车,那么X将包含两个班级成员A和B,而子类将引用这些成员。
第三方面,如果实际上只有来自A而且仅来自B的类,那么你可以选择使用接口并接受这样的事实,即某些实现可能必须在A的后代中重复(并且在B中单独)在X中,或者,或许等效地,从基类派生X并在X中复制B和C的函数。这两个选项中的任何一个都不是理想的,你可以选择合并它们并从X派生所有内容,无论它是否真是来自A或来自B.