【问题标题】:inheriting from multiple classes?从多个类继承?
【发布时间】:2013-05-19 02:05:35
【问题描述】:

我在 Java 中有以下接口和实现层次结构:

A <- B <- C

A_impl <- B_impl <- C_impl

其中A &lt;- B 表示B 扩展A,而A_impl 实现A

现在我想用D 扩展B,同时用E 扩展CD,换句话说:

A <- B <- C <-|
     <- D <-- E

我有D_impl 扩展B_impl,但E_impl 应该扩展什么? E_impl 实现了 CD 但我不能在 Java 中同时扩展 C_implD_impl。那我该怎么办?

【问题讨论】:

  • Java 中没有多重继承。但是,您可以实现多个接口。
  • B 不能扩展 C 和 D,因为现在在 java 中有多重继承,但 B 可以扩展 C 并包装类 D

标签: java inheritance interface multiple-inheritance


【解决方案1】:

我看到了 2 个解决方案:

  1. 让 D 扩展 C(反之亦然)。这样,当 E 扩展 D 时,它也在扩展 C。
    • 您的犹豫将看起来像 A
  2. 使用接口而不是子类。

希望 1 的作品不会造成太多麻烦。

【讨论】:

    【解决方案2】:

    在 Java 中不能进行多重继承,但可以使用多个接口。另一个很酷的解决方案是使用 lomboks @Delegate 而不是继承,而是将 lomboks @Delegate 用于您想要扩展的一个或两个类,它会以一种很酷、简洁的方式为您提供许多相同的功能。

    http://projectlombok.org/features/Delegate.html

    【讨论】:

      【解决方案3】:

      我所看到的(如果我对 Q 的理解是正确的),您的问题出在 E/E_impl 那么您想要做什么(省略impl):

       A <-  B <- C <---+         
             ^           \        
             |            - E     
             +----D <---+/        
      

      解决方案 1(跳过E 界面)。

                    (implements)  
       A <-  B <- C <|--+         
             ^           \        
             |            - E_impl (normal class)
             +----D <|--+/        
                    (implements)  
      

      这样,E_impl 类型的对象 CD(当然 AB 也是)如果你真的想要一个通用/抽象类型 E ,见解决方案2

      解决方案 2(使用抽象类 EA 并且您的 E_impl 扩展它)

                     (implements)
       A <-  B <- C <|--+
             ^           \ 
             |            - EA(abstract class) <--(extends)--E_impl
             +----D <|--+/
                    (implements)
      

      在这种情况下,您的E_impl EA, C, D, B, A

      我希望这能回答你的问题。

      还要考虑 composition 是否可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 2012-06-17
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 2011-09-04
        相关资源
        最近更新 更多