【问题标题】:Sort of multiple inheritance?多重继承之类的?
【发布时间】:2017-02-04 05:15:01
【问题描述】:

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

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

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

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

我也不想创建 Blah 的副本,即 ExtBlah,因为这意味着代码的重复,并且支持起来更加困难和混乱。

有什么想法吗?

【问题讨论】:

  • 将 Blah 嵌入 ExtBlah 以使其成为适配器
  • 是的,这里可以使用Delegation Pattern。如果您使用的是 NetBeans,Alt-Ins 会弹出一个菜单,允许自动生成方法。
  • 另外,Java 没有“脚本”,所以请不要这样称呼它们。可能您的意思是类,但“源文件”和“编译单元”也可能是合适的。
  • 我不能嵌入,因为 Base&ExtBase 是 jar 的一部分。我可以访问 jar,但它是我不想污染它的框架的一部分。谢谢
  • 查看 aop (aspectj) 声明父母

标签: java class inheritance design-patterns


【解决方案1】:

我还有一个复杂的问题是 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()”,您可以委托所有方法。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有一个复杂性,因为 Base&ExtBase 的代码在初始化/构造时运行。如果您说我必须拥有私有实例,这意味着我将运行两次初始化,这很糟糕。但这给了我一些思考
    • 如果可以尝试将 Base 包装到 singleton 类中。通过这种方式,您只实例化 Blah 类一次。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2015-01-18
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2011-10-15
    • 2019-12-13
    • 2017-06-14
    相关资源
    最近更新 更多