2016-09-26 150 views
0

我有下面的类结构(布拉赫=== ExtBlah):多重继承的分类?

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

现在我需要写更多的脚本,需要延长胡说,而是布拉赫具有延长“ExtBase”,而不是“基地”为新的剧本案件。

我仍然需要Blah,因为Scripts1-N必须依赖于“Base”,而不是“ExtBase”。

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

任何想法?

+2

将一个Blah嵌入到ExtBlah中使其成为一个适配器 –

+1

是的,这里有一个[Delegation Pattern](https://en.wikipedia.org/wiki/Delegation_pattern)。如果您使用的是NetBeans的'Alt-Ins',将会出现一个菜单,允许自动生成方法。 – markspace

+1

另外,Java没有“脚本”,所以请不要称它们为“脚本”。可能你的意思是类,但“源文件”和“编译单元”也可能是合适的。 – markspace

回答

0

我也有基本& ExtBase已经初始化例程的并发症,准备DB连接和其他东西阻止我从实例多个实例基地继承。

这是我做的。

创建一个单独的util状类BaseUtil然后在布拉赫& ExtBlah推翻的init()是这样的:

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

/现在布拉赫延伸基地ExtBlah延伸ExtBase和BaseUtil包含所有共享的功能性,但仍可以像Base一样行为,因为我传递了所有的共享属性,而不需要调用init()两次。

所以这个想法是创建一个对象的实例,它保存所有的共享功能,即不复制代码,而是复制属性。 BaseUtil不在层次结构中。

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

1

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

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

有一个复杂因素,因为Base&ExtBase具有在初始化/构造上运行的代码。如果你说我必须有私人实例,这意味着我会有两个初始化运行,这是icky。但是这给了我一些想法 – user1019129

+0

如果有可能尝试将Base包装到[singleton](https://en.wikipedia.org/wiki/Singleton_pattern)类中。通过这种方式,您只能将类Blah实例化一次。 – fusiled