2

したがって、クラスA、B、Cがあり、それらすべてのクラスから継承し、Dという別のクラスを作成したいとします。これは、Javaの実装とインターフェイスを使用して実行できます。しかし、この単純なソリューションを使用したくないとしましょう。Javaで他の方法でクラスA、B、およびCからクラスDを継承できますか?

(この質問はデザインパターンに関連している可能性があります。昼食時に同僚にデザインパターンについて話し合った後に出されました)複数のインターフェイスを使用する以外に、Javaで多重継承を行う方法は他にないと思います。

4

6 に答える 6

3

Java SE 8以降、インターフェースの実装は制限される場合があります。これにより、実装の多重継承の形式が得られます。

多重継承の代わりに、内部クラスは同様のジョブを実行できます。

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

BaseOneメソッドを呼び出す必要性からオーバーライドされたメソッドの場合BaseTwo、内部クラスへの明示的な参照が必要になりますが、その逆は必要なく、Derivedフィールドは共有されます。

于 2012-08-28T16:00:24.250 に答える
3

多重継承はできません。

とにかく、合成でそのような継承をシミュレートしようとすることができます。

JB Nizetが提供されたリンクであなたの質問に答えました。

于 2012-08-28T15:36:27.920 に答える
2

いいえ。多重継承に対する Java のアプローチは、インターフェースを使用することです。

于 2012-08-28T15:34:38.460 に答える
2

Java のクラスは、厳密に 1 つのクラスから継承できます (基底クラスを指定しない場合、それは ですjava.lang.Object)。3 つのクラスから継承する唯一の方法は、チェーン内で相互に継承する場合です。

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

あなたのクラスは、、およびDを継承していますが、これがあなたが探していたものであるとは思えません。ABC

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
}
于 2012-08-28T15:34:51.827 に答える
1

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ますが、拡張されます。ABC

于 2012-08-28T15:36:07.410 に答える
0

簡単な答えはノーです。複数のインターフェースは多重継承ではありません。インターフェイスとクラスは別個の概念です。

クラスはオブジェクトの定義であり、インターフェイスはコントラクトであるため、オブジェクトは従わなければなりません。

于 2012-08-28T15:35:16.337 に答える