4

1 つのクラスを拡張する必要がある 2 つのクラスがあります。これは Java では発生しないため、コンパイラ エラーが発生します。Java では好きなだけインターフェイスを実装できますが、他のクラスを 1 つしか拡張できません。この問題を解決するにはどうすればよいですか?

4

4 に答える 4

7

「is An」の代わりに「has A」関係を使用します。

class A
class B

あなたは(考えて)欲しい:

class C extends A, B

代わりに、次のようにします。

class C {
  A theA;
  B theB;
}

多重継承はほとんどの場合悪用されます。クラスのデータとメソッドをインポートする簡単な方法として、クラスを拡張することは適切ではありません。クラスを拡張する場合、それは真に「is An」関係である必要があります。

たとえば、クラスがあるとします。

class Bank extends Financial
class Calculator

Calculatorinの関数を使用する場合は、これを行うことができますBank

class Bank extends Calculator, Financial

ただし、 aBankは間違いなく a ではありませんCalculator。Bankは を使用しますCalculator、それ自体ではありません。もちろん、Java ではそれができませんが、できる言語は他にもあります。

それを購入せず、 の機能をのインターフェースのCalculator一部にしたい場合Bankは、Java インターフェースを介してそれを行うことができます。

interface CalculatorIntf {
  int add(int a, int b);
}

class Calculator implements CalculatorInf {
  int add(int a, int b) { return a + b };
}

class Bank extends Financial implements CalculatorIntf
  Calculator c = new Calculator();

  @Override // Method from Calculator interface
  int add(int a, int b) { c.add(a, b); }
}

クラスは、必要な数のインターフェイスを実装できます。これはまだ技術的には「has A」の関係であることに注意してください

于 2012-09-20T18:51:04.677 に答える
1

「1 つのクラスを拡張する 2 つのクラス」は合法です。

「2 つのクラスを拡張する 1 つのクラス」は、言語の仕様に反します。インターフェイスを考慮したくない場合は、実行できません。

于 2012-09-20T18:50:31.857 に答える
0

ひし形の問題を回避するために、Java はクラスによる多重継承をサポートしていませんが、インターフェースの使用はサポートしています。

したがって、AssociationRelationship を使用できます。例えば

Class A {}
Class B {}
Class C implements SomeInterface {
  A a;
  B b;
  // setter getter for a and b and other methods
}
于 2012-09-20T18:50:56.443 に答える
0

1 つのクラスを拡張する 2 つのクラス? そのようです:

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

ここで、B と C (2 つのクラス) は A (1 つのクラス) を拡張します。しかし、2 つの別々のクラス (多重継承) を拡張する 1 つのクラスを意味していたと確信しています。回避策: 次のように、2 つの別個のオブジェクト (Has-A 関係) を持つ複合オブジェクトを作成できます。

class A { }
class B { }
class C extends A { /*define new functionality here */ }
class D extends B { /*define new functionality here */ }
class E { private C cObj; private D dObj; }
于 2012-09-20T18:53:08.907 に答える