对于具有共同祖先和共同后代的不同类,我应该选择什么样的设计模式?

时间:2015-07-14 12:52:11

标签: delphi oop design-patterns refactoring

我现在正在重构一些代码。我有两个 - 多数是多余的 - 单位,每个产品一个。两者都包含一个继承少数子类的基类。这些也继承了更多的子类。

现在我想要合并两个单元,这样冗余代码就不再冗余,不同的部分分别在两个不同的单元中实现。

我首先想到了一些类似下面的例子:

                        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语言中这种继承是不可能的。

所以,我认为必须有一个设计模式,这对于使用公共父类和公共后代类来实现这样的模型是有用的吗?

编辑:我制作了一个UML类图来澄清当前的情况。 UML diagram of current situation

2 个答案:

答案 0 :(得分:3)

  

现在我想要合并两个单元,这样冗余代码就不再冗余,不同的部分分别在两个不同的单元中实现。

如果AB来自BaseClass并且每个人仍然拥有某些(您的X),那么您应该意识到某事应该是BaseClass的一部分。这是你的解决方案,它真的很简单。

如果AB将执行委托给外部代码(包含事件,回调例程等等),这些代码恰好是每个代码的相同代码,在不知不觉中,那就是细

答案 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.