多重继承的排序?

时间:2016-09-26 18:34:55

标签: java class inheritance design-patterns

我有以下类结构(Blah === ExtBlah):

Base
 +--[ ExtBase ]    --???-- [ ExtBlah ] --- .. more scripts ...
 +--[ Blah ]
        +---[ Script1 ]
        +---[ Script2 ]
        +---[ ....... ]
        +---[ ScriptN ]     

现在我需要编写更多需要扩展Blah的脚本,但Blah必须扩展" ExtBase"而不是" Base"对于新的脚本案例。

我仍然必须按照原样使用Blah,因为Scripts1-N必须依赖" Base"而不是" ExtBase"。

此外,我不想创建一个Blah副本,即ExtBlah,因为这意味着代码的重复,并且将更难以支持。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

正如Jean-Baptiste在评论中所说,如果你不想复制Blah的代码,请将其封装到ExtBlah并调用Blah的方法。请记住添加通用界面。实际上,接口试图解决一些多继承问题。

Base
 +--[ ExtBase ]
 +--[ Blah ] implements BlahInterface
        +---[ Script1 ]
        +---[ Script2 ]
        +---[ ....... ]
        +---[ ScriptN ]   
 +--[ ExtBlah: - private Blah instance] implements BlahInterface
        +---[ ScriptK ]

答案 1 :(得分:0)

我还有一个复杂的问题,Base& ExtBase有init例程,它们准备数据库连接和其他阻止我实例化从Base继承的多个实例的东西。

这就是我所做的。

创建一个单独的类似于util的类BaseUtil然后在Blah& ExtBlah中覆盖init(),如下所示:

 @Override
 public void init() {
   super.init();
   util = new BaseUtil(this.shared1, this.shared2, ....);
 }

/现在Blah扩展了Base,ExtBlah扩展了ExtBase,BaseUtil包含了所有共享功能,但仍然可以像Base一样,因为我传递了所有共享属性,无需调用init()两次/.

因此,我们的想法是创建一个包含所有共享功能的对象实例,即不复制代码,而是复制属性。 BaseUtil位于层次结构之外。

PS>如果您有太多共享属性,这可能会很尴尬。 此外,如果您不想更改原始脚本以使用" util.method()"你可以委派所有的方法。