没有多重继承的方法怎么做

时间:2012-01-02 18:09:16

标签: java inheritance

我有一组扩展单个抽象类的类。这些类的子集需要对其中一个方法执行相同的实现,另一个类的子集需要该方法的另一个实现,而第三个子集需要另一个。总共大约有十个子类,但只有三种可能的实现方法之一。 (这些类实现的许多其他方法没有任何共同之处。)

我正试图找出实现这一目标的最佳方法。我认为我在C ++中所做的是多重继承:创建仅实现此方法的三个类,然后让子类从这三个类中的适当的一个继承。

在Java中执行此操作是否有最佳做法?

我正在考虑在主要抽象类和孩子之间插入三个抽象类。三者中的每一个都继承自主要抽象类,并实现有问题的方法。然后孩子们继承了这三个人。但是我不喜欢的是,如果另一种方法带有类似的“分组”行为,并且它不对应于三个“中间层”类?那会很难看

这有什么意义吗?我匆匆写作......

编辑:因此,在提问我24小时后,我收到了大约六种模式进行调查。我还不确定它们都是官方设计模式名称。但我会调查每一个,然后向后报告(并选择一个正确的答案)。到目前为止,模仿建议:

* Delegation

* Bridge

* Strategy

* Composition

* Decorator (if I was choosing on name alone, I choose this one)

我还需要补充一点,正在实现的方法需要访问几乎所有类的私有成员。所以这将是我选择的重要因素。

5 个答案:

答案 0 :(得分:7)

实际上,我在这里闻到了战略模式。

您可以将基类中的该方法委托给构造时传递的策略。子类只是通过一组策略中的任何一个作为其构造的一部分。策略本身可以在课外提供,也可以在内部提供私人课程。这最终可能会减少您的层次结构中的整体课程。

话虽如此,这里还有其他气味,即使我提出的解决方案也是如此。您可能希望在更高级别上考虑接口(如其他解决方案所述)和组合,只考虑没有继承。随着时间的推移,我得出结论,继承不是我的朋友。现在我尽可能避免它。

答案 1 :(得分:6)

使用委托而不是继承。将同一组的所有类委托给公共帮助程序对象以实现其方法。

答案 2 :(得分:3)

如果你坚持通过继承来解决它,那么来自GoF书籍的bridge pattern可以在这里提供帮助(它可能是也可能不是完美契合,取决于哪个域关注导致分离为三个实现)。就个人而言,我可能只是将三个方法实现放入一个辅助类中,并转发类中的方法调用(JB Nizet正确地称为委托)。

答案 3 :(得分:1)

不使用继承的简单快速解决方案是将3个“常用方法”抽象到其他地方,然后重复方法调用。

如果你想以一个漂亮的OO方式来做,那么看看装饰模式,这可能会有帮助 - 创建你的3个标准类,实现你的三个选择的方法,然后用其他类“装饰”它们

答案 4 :(得分:1)

首先,考虑用接口替换抽象类。我不知道是否有可能 在你的情况下。

其次,您可以将“分组”方法的功能删除到另一个类(实现者)。使用该方法的实现创建3个不同的类(或者在某个类中只创建3个不同的方法),并根据需要从子类中调用它们。

因此,“grouping”方法将在每个子类中定义,但它只是显式调用3个可能的实现者之一。