【问题标题】:Inheriting from multiple classes in Java (and possibly not using interface)从 Java 中的多个类继承(可能不使用接口)
【发布时间】:2012-08-23 03:55:17
【问题描述】:

所以,假设我们有 A、B 和 C 类,我想从所有这些类继承并有另一个名为 D 的类,这可以使用 Java 中的实现和接口来完成。但是假设我们不想使用这个简单的解决方案,你能在 Java 中以任何其他方式从类 A、B 和 C 继承类 D 吗?

(这个问题可能与设计模式有关,在午餐讨论设计模式时挑战我的同事后提出)我认为除了使用多个接口之外,Java 中没有其他方法可以实现多重继承。

【问题讨论】:

  • 一种方法可以让classA扩展ClassB,ClassB扩展ClassC。 ClassD 扩展 ClassA。
  • How to accept answers in Stack Overflow ? 33% ..给我们一个帮助你的理由..
  • 如果 A、B 和 C 类都有您希望重用的行为,那么只需将它们用作委托?
  • let's say we don't want to use this simple solution 那么你会问为什么不呢? ;)
  • @Kuf 谢谢,我不知道怎么做,伙计,它上升了

标签: java interface multiple-inheritance


【解决方案1】:

没有。 Java 的多重继承方法是使用接口。

【讨论】:

    【解决方案2】:

    Java 中的类只能继承自一个类(如果不指定基类,则为java.lang.Object)。从三个类继承的唯一方法是它们在链中相互继承:

    class A {}
    class B extends A {}
    class C extends B {}
    class D extends C {}
    

    现在您的 D 类继承自 ABC,但我怀疑这就是您要寻找的。​​p>

    Java 中惯用的解决方案是实现多个接口而不是继承多个类。如果您必须“继承”实现,请使用组合而不是继承。

    interface IA {}
    interface IB {}
    interface IC {}
    class A implements IA {}
    class B implements IB {}
    class C implements IC {}
    class D implements IA, IB, IC {
        A a = ...;
        B b = ...;
        C c = ...;
        // Implementations of methods from IA, IB, and IC
        // need to forward the calls to a, b, and c
    }
    

    【讨论】:

      【解决方案3】:

      快速回答是否定的。多个接口不是多重继承。接口和类是不同的概念。

      类是对象的定义,而接口是对象必须遵循的契约。

      【讨论】:

        【解决方案4】:

        Java 不支持class D extends A, B, C 意义上的多重继承。正如 Lanaru 所提到的,最好的方法是使用接口。

        否则,您可以这样做:

        public class A {}
        public class B extends A {}
        public class C extends B {}
        public class D extends C {}
        

        实际上,D 将通过C 间接扩展AB

        【讨论】:

          【解决方案5】:

          多重继承是不可能的。

          无论如何,您可以尝试使用composition 模拟这种继承。

          JB Nizet 在提供的链接中回答了您的问题。

          【讨论】:

            【解决方案6】:

            从 Java SE 8 开始,接口的实现可能有限。这提供了一种实现的多重继承形式。

            作为多重继承的替代方案,内部类可以执行类似的工作。

            class Derived extends BaseOne {
                ... fields ...
                private class InnerTwo extends BaseTwo {
                    ... code with access to Derived's fields ...
                }
            }
            

            如果从BaseOne 覆盖的方法需要调用BaseTwo 的方法,它们将需要对内部类的显式引用,而不是相反,Derived 字段是共享的。

            【讨论】:

            • 有趣的方法,我之前没有想过这种方法
            猜你喜欢
            • 2021-09-12
            • 2010-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-06
            相关资源
            最近更新 更多