특성 A가 B를 확장하면 A를 혼합하면 A에 추가하거나 확장하는 모든 것을 정확하게 B에 더 해줍니다. 반대로, 특성 A에 명시 적으로 B로 유형이 지정된 자체 참조가있는 경우 최종 상위 클래스는 B 또는 하위 유형의 B 도 혼합해야합니다 ( 먼저 이를 혼합해야 합니다).
그것이 가장 중요한 차이점입니다. 첫 번째 경우, 정확한 유형의 B는 A 지점이 연장되는 지점에서 결정화됩니다. 두 번째로, 부모 클래스의 디자이너는 부모 클래스가 구성되는 시점에서 어떤 버전의 B가 사용되는지 결정합니다.
또 다른 차이점은 A와 B가 같은 이름의 메소드를 제공하는 것입니다. A가 B를 확장하는 경우 A의 방법은 B보다 우선합니다. A가 B 다음에 섞인 경우 A의 방법이 단순히 이깁니다.
입력 된 자체 참조는 훨씬 더 많은 자유를줍니다. A와 B의 커플 링이 느슨합니다.
최신 정보:
이러한 차이점의 이점에 대해 명확하지 않기 때문에 ...
직접 상속을 사용하는 경우 B + A 인 특성 A를 만듭니다. 당신은 돌로 관계를 설정했습니다.
유형이 지정된 자체 참조를 사용하는 경우 클래스 C에서 특성 A를 사용하려는 사람은 누구나
- B와 A를 C에 섞는다.
- B의 하위 유형을 혼합 한 다음 A를 C에 혼합하십시오.
- A를 C에 혼합하십시오. 여기서 C는 B의 서브 클래스입니다.
스칼라가 코드 블록을 생성자로 사용하여 특성을 직접 인스턴스화 할 수있는 방법을 고려할 때 이는 옵션의 한계가 아닙니다.
A의 방법 우승 의 차이점은 A가 B를 확장하는 A와 비교하여 마지막에 혼합되기 때문에 이것을 고려하십시오 ...
일련의 특성을 혼합하는 foo()
경우, 메소드 가 호출 될 때마다 컴파일러는 혼합 된 마지막 특성으로 이동 foo()
한 다음 (찾을 수없는 경우) 구현 foo()
하고 사용 하는 특성을 찾을 때까지 순서를 왼쪽으로 탐색 합니다. 그. A에는 호출 옵션 super.foo()
이 있으며 구현을 찾을 때까지 시퀀스를 왼쪽으로 이동합니다.
따라서 A가 B에 대한 자체 참조 유형을 가지고 있고 A의 작성자가 B가 구현 한다는 것을 알고 있다면 foo()
A는 super.foo()
아무것도 제공하지 않으면 foo()
B가 할 것이라는 것을 알 수 있습니다 . 그러나 클래스 C의 작성자는를 구현하는 다른 특성을 제거하는 옵션이 있으며 foo()
대신 A 가이를 얻습니다.
다시 말하지만 이것은 A 확장 B보다 훨씬 강력하고 제한이 적으며 B의 버전을 직접 호출 foo()
합니다.