Java は多重継承をサポートしていません。これは、2 つのクラスが同じ関数名を持ち、実装が異なる場合、3 番目のクラスがこれら 2 つのクラスを継承し、メソッドを使用する必要がある場合、どのメソッドを呼び出す必要があるかについて混乱を招くためです。そのため、Java は複数のインターフェースの概念を使用します。しかし、2つの複数のインターフェースも同じ関数名で実装が異なる場合、および3番目のクラスがこれら2つのインターフェースを実装し、そのメソッドに実装を提供する場合、それは問題ではないのではないかと思います。説明してください?
5 に答える
Java インターフェイスはメソッド名のみを定義し、実装はありません。メソッドの実装は、インターフェイスを実装するクラスで行われます。したがって、問題は回避されます。
2 つのインターフェースが、 2 つの異なることを行うことになっている同じ署名を持つメソッドを提供する場合、この問題は少しあります。結局のところ、インターフェイスはメソッドのシグネチャを指定するだけでなく、実装方法の契約も指定します (ただし、コンパイラは強制できません)。その場合、実際には両方のインターフェースを拡張することはできません。なぜなら、実装は 1 つのメソッドしか提供できないためです (したがって、2 つのコントラクトのうちの 1 つを実行するために選択する必要があります)。もちろん、これはランタイム システムの問題ではなく、インターフェイスの設計の問題です。
2 つのメソッドのパラメーターが同じで、戻り値の型が異なる場合、2 つのインターフェイス間の競合が発生します。
例:
public class MultipleInterfaceClash {
public interface Foo {
String baz(int a, String x);
}
public interface Bar {
Double baz(int a, String x);
}
public class Confused implements Foo, Bar {
// Compile error: The return type is incompatible with
// MultipleInterfaceClash.Foo.baz(int, String)
public Double baz(int a, String x) {
return null;
}
}
}
これらの両方のインターフェースを実装することはできません。
インターフェイスには実装がありません。
メソッド定義のみ
public Interface a{ void a(); }
インターフェイスは、ユーザーにコントラクトを提供するだけです。この場合は、メソッド シグネチャです。実装クラスは、この規約に従う必要があります。したがって、2 つ以上のインターフェイスが同じコントラクトを指定する場合、実装が目的を果たすため、実装クラスに問題はありません。
インターフェイスには、デフォルトの実装はありません。メソッド署名のみが指定されています。