1 つのクラスを拡張する必要がある 2 つのクラスがあります。これは Java では発生しないため、コンパイラ エラーが発生します。Java では好きなだけインターフェイスを実装できますが、他のクラスを 1 つしか拡張できません。この問題を解決するにはどうすればよいですか?
4 に答える
「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
Calculator
inの関数を使用する場合は、これを行うことができます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」の関係であることに注意してください
「1 つのクラスを拡張する 2 つのクラス」は合法です。
「2 つのクラスを拡張する 1 つのクラス」は、言語の仕様に反します。インターフェイスを考慮したくない場合は、実行できません。
ひし形の問題を回避するために、Java はクラスによる多重継承をサポートしていませんが、インターフェースの使用はサポートしています。
したがって、Association
Relationship を使用できます。例えば
Class A {}
Class B {}
Class C implements SomeInterface {
A a;
B b;
// setter getter for a and b and other methods
}
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; }