문제

다이아몬드 문제에 대한 위키 백과 :

"... 다이아몬드 문제는 두 클래스 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 ++ 배경에서 나옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top