次のコードについて考えてみましょう
interface P {
public void doSomething();
}
interface Q {
public void doSomething();
}
class A {
public void doSomething() {
}
}
class B {
public void doSomething() {
}
}
class C implements P,Q {
public void doSomething(){
// implementation
}
}
class D extends A,B { // suppose it is possible
}
Cのオブジェクトを使用するにはdoSomething()
、Cクラスで実装しています。これはCクラスでのみ実装されています。
doSomething
しかし、D のオブジェクトを作成して、どのメソッドを呼び出せばよいでしょうか? このメソッドは A と B の両方で実装されているためです。
ダイヤモンド問題
実際、本当のダイアモンの問題は
class A {
public void doSomething() {
}
}
class B extends A{
public void doSomething() {
}
}
class C extends A{
public void doSomething() {
}
}
class D extends B,C { // suppose it is possible
// no implementation of doSomething.
}
ダイヤモンドの形をしていることからダイヤモンドと呼ばれています。以下を行いたい場合はこちら
D d = new D();
d.doSomething(); // which method should be called now????
ウィキペディアからここに素晴らしいリアルタイムの例があります
たとえば、GUI ソフトウェア開発のコンテキストでは、クラス Button はクラス Rectangle (外観用) と Clickable (機能/入力処理用) の両方から継承し、クラス Rectangle と Clickable は両方とも Object クラスから継承します。Button オブジェクトに対して equals メソッドが呼び出され、Button クラスにはそのようなメソッドがなく、Rectangle と Clickable の両方にオーバーライドされた equals メソッドがある場合、最終的にどのメソッドを呼び出す必要がありますか?