【发布时间】:2015-07-14 12:52:10
【问题描述】:
我现在正在重构我的一些代码。我有两个——大部分是多余的——单元,每个产品一个。两者都包含一个继承少数子类的基类。它们也继承了更多的子类。
现在我想合并两个单元,这样冗余代码就不再是冗余的了,不同的部分分别在两个不同的单元中实现。
我首先想到了一些像下面这样的层次结构:
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 语言中是不可能的。
那么,我认为必须有一种设计模式,它对实现具有公共父类和公共后代类的模型很有用?
【问题讨论】:
-
你可以用接口构建它。
-
@TLama 但是我该如何实现代码呢?接口应该是什么?所有类(除了那些产品类)确实已经存在。
-
就像 TLama 所说,使用接口并将通用功能委托给自己的类。在您的 BaseClass 和后代中使用这些类。 Favor composition over inheritance
-
什么是 X?类设计的“钻石”形状经常导致混乱。为什么不将
Product<A>BaseClass和Product<A>BaseClass放在一起(一个类),或者如果它们应该分开,有单独的子类?至于模式,您是否将delegation via interfaces 视为一种模式,而不是正常的多态性?这允许您拥有一组具有相同接口的类,您不必重写实现,因为您委托给另一个(共享)类。 -
这就是将继承作为重用代码和删除重复的机制的问题。它忽略了重用代码的最自然方式,即:简单地使用其他对象。您几乎可以肯定有一个问题,因为您当前的对象正在做“太多”。将通用功能提取到单独的类中。 (注意:其他人建议的 interface 不是必需的,但在某些情况下它们可能很有用。)
标签: delphi oop design-patterns refactoring