我有以下类结构(Blah === ExtBlah):
Base
+--[ ExtBase ] --???-- [ ExtBlah ] --- .. more scripts ...
+--[ Blah ]
+---[ Script1 ]
+---[ Script2 ]
+---[ ....... ]
+---[ ScriptN ]
现在我需要编写更多需要扩展Blah的脚本,但Blah必须扩展" ExtBase"而不是" Base"对于新的脚本案例。
我仍然必须按照原样使用Blah,因为Scripts1-N必须依赖" Base"而不是" ExtBase"。
此外,我不想创建一个Blah副本,即ExtBlah,因为这意味着代码的重复,并且将更难以支持。
有什么想法吗?
答案 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()"你可以委派所有的方法。