Java では、複数のクラスを拡張することはできません。インターフェースも存在することは知っていますが、今回は使用したくありません。Java で複数のクラスを拡張するためのトリックや回避策はありますか? はいの場合は、サンプル コードも含めてください。
12 に答える
いいえ、C++ とは異なり、複数のクラスを拡張することはできませんが、複数のインターフェイスを実装することはできます。
Java での多重継承は、通常、複数のインターフェースを実装することによって行われます。複数のクラスを拡張することはできません。考えられる回避策は、インスタンスの集約にある種のオブジェクト構成を使用することです。
番号。
interfaces
がんばれ。inheritance in Java.
多重継承はひし形の問題を引き起こす可能性があります。
JAVA は、C++ のほとんど使用されず、よく理解されていない、紛らわしい機能の多くを省略しています。これは主に、演算子のオーバーロード (ただし、メソッドのオーバーロードはあります)、多重継承、および広範な自動強制で構成されています _ Dr. James Gosling
Java はクラスに対してこれをサポートしていません。複数のインターフェイスを使用できます。Java で多重継承の問題を見つけることができます。
次のような内部クラスを使用できます
public class class1 extends class2{
class Inner extends class3{
}
}
これは役立つかもしれません
class One{
void oneMethod(){
}
}
class Two extends One{
void TwoMethod(){
}
}
class Abc extends Two{
@Override
void oneMethod() {
// TODO Auto-generated method stub
super.oneMethod();
}
@Override
void TwoMethod() {
// TODO Auto-generated method stub
super.TwoMethod();
}
}
答えはノーです。
A が B を拡張 B
B が C を拡張
したがって、A は B と C を拡張します
代わりにインターフェースを使用してください。コードでは次のようになります。
public Class ClassName implements Interface1, Interface2 {
Methods, fields etc...
}
ひし形の問題を回避するために、 Java はクラスによる多重継承をサポートしていませんが、インターフェイスの使用はサポートしています。したがって、Association Relationship を使用できます。例えば
Class A {}
Class B {}
Class C implements SomeInterface {
A a;
B b;
// setter getter for a and b and other methods
}
機能のルックアップを使用できます。
class Vehicle {
T <T> lookup(Class<T> klazz) {
return map.get(klazz); // typically
}
}
interface Flyable {
void fly();
}
Vehicle x;
Flyable f = x.lookup(Flyable.class);
if (f != null) {
f.fly();
}
これにより、クラスが分離されます。ただし、実行時チェックが必要です。
委任を使用します。つまり、ルックアップされたクラス/インターフェイスを実装するローカル メンバーです。
アドバンテージ:
飛行 (Flyable) と潜水 (Diving) の両方が可能なクラスを Vehicle から派生させることができます。フライングは、共有クラスのインスタンスによって実装できます。機能を動的に構成する (ボートに車輪を追加する) こともできます。
fly()
これは、多くの場合、コード コピーまたは Flyable フィールドへのデリゲート (共有実装クラスを使用) のいずれかである複数のインターフェイスを実装するよりも優れています。
特に複数のインターフェイス/クラスが関係している場合は、ケースと安全でないキャストを使用して基本クラス オブジェクト (ここでは Vehicle) のコードを危険にさらし、if (x instanceof Boat)
.