문제
다이아몬드 문제에 대한 위키 백과 :
"... 다이아몬드 문제는 두 클래스 B와 C가 A에서 상속 될 때 발생하는 모호성이며 클래스 D는 B와 C 모두에서 상속됩니다. D의 메소드가 A에 정의 된 메소드를 호출하는 경우 ), 그리고 b와 c는 그 방법을 다르게 상체 한 다음 어떤 클래스에서 상속을 받는다 : b 또는 c? "
그래서 다이아몬드는 다음과 같습니다.
A
/ \
B C
\ /
D
내 질문은, 그러한 클래스 A가 없다면 어떻게되는지, 그러나 B와 C는 다시 같은 방법을 선언합니다. foo (). 이것이 같은 문제가 아닌가? 그런 다음 왜 다이아몬드 문제라고 불리는가?
예시:
class B {
public void foo() {...}
}
class C {
public void foo() {...}
}
class D extends B, C {
}
new D().foo();
해결책
같은 문제가 아닙니다.
원래 문제에서, 재정의 메소드는 A에서 호출 할 수 있습니다. 문제에서는 존재하지 않기 때문에 그렇지 않습니다.
다이아몬드 문제에서 클래스 A가 메소드를 FOO라고 호출하면 충돌이 발생합니다. 일반적으로 이것은 문제가되지 않습니다. 그러나 클래스 D에서는 FOO의 인스턴스를 알 수 없습니다.
+--------+
| A |
| Foo |
| Bar |
+--------+
/ \
/ \
/ \
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
당신의 문제에는 방법을 부를 수있는 공통 조상이 없습니다. 클래스 D에는 FOO의 두 가지 맛이 있지만 적어도 두 가지가 있다는 것을 알고 있습니다. 그리고 둘 중에서 선택할 수 있습니다.
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
그러나 항상 그렇듯이 여러 상속이 필요하지 않습니다. Aggegration과 인터페이스를 사용하여 이러한 모든 문제를 해결할 수 있습니다.
다른 팁
다이아몬드 문제에서 클래스 D는 클래스 A의 가상 메소드를 암시 적으로 상속합니다.
A::foo()
클래스 B와 C 가이 방법을 무시하면 문제가 실제로 호출됩니다.
그러나 두 번째 예에서는 클래스 D가 명시 적으로 표시되어야하기 때문에 다음과 같은 경우가 아닙니다.
B::foo()
C::foo()
따라서 문제는 실제로 동일하지 않습니다. 다이아몬드 문제에서는 파생 클래스를 참조하는 것이 아니라 기본 클래스, 따라서 모호성입니다.
어쨌든 내가 이해하는 방법입니다.
C ++ 배경에서 나옵니다.