2015-01-18 5 views
4

저는 스칼라에서 다중 상속을 실험하고 있습니다. 오른쪽에서 왼쪽으로 해상도가 표시되지만 override 키워드의 역할을 이해하지 못합니다. 이제 다음 코드를 살펴 보자 :상속 된 형질이 결합 될 때 "오버라이드"는 어떻게 작동합니까?

trait A   { def   method    } 
class B extends A { def   method = println("B") } 
trait C extends A { override def method = println("C") } 
trait E   {         } 
class D extends B with C with E 

그것은 잘 컴파일,하지만 난 method을 정의하는 가장 오른쪽 특성에서 override를 제거하면, 그것은 깨진입니다. 왜 이런거야 ? 키워드 없이도 메서드가 재정의되지 않습니까?

답변

3

특성이 메소드의 누락 된 구현을 대체하는 대신 대체되어야하는 경우 override 키워드를 사용해야합니다. 이것은 다른 방법이 특성으로 제공되는지 또는 다른 방법으로 제공되는지에 상관없이 사실입니다. 예를 들어 :

trait X { def foo = "foo" } 
class Y { def foo = "bar" } 
class Z extends Y with X // Does not compile 

그래서 정말 추상 클래스와 마찬가지로 동일한 규칙을 : 당신은 당신이 교체 (보다는 처음 제공) 그 구현 방법을 재정의해야합니다. 특성과 함께 한 마지막 제공 방법을 재정의이기 때문에, 충분히 것을

참고 : "이미 제공"확장의 이전 부분이며, 모두의 여기

trait L { def m: String } 
trait M extends L { def m = "m" } 
trait N extends L { def m = "M" } 
trait O extends L { override def m = "?" } 
class P extends M with N with O // All good 
class Q extends M with N { override def m = "." } // Also good 

, 무슨 계산 그럼 잘 끝납니다. Om의 구현을 (그것을 할 필요가있는 경우 오버라이드 (override) 할 수있는) 제공하지만, N 다음 다른 적용을 시도하고,이 오버라이드 (override) 할 수 없습니다 때문에 그래서

class R extends O with N 

은 작동하지 않습니다. 비록 MN 모두 m에 대한 구현을 제공하려고하기 때문에 한편

, P은 괜찮 O 지난 제공과 그 구현이 오버라이드 (override) 함을 선언합니다. 그렇게하면 모든 것이 잘됩니다.

+0

나는 아직도 그것을 얻지 못한다.'누락 된 구현을 제공하는 것이 아니라'그것이 무엇을하지 않는가? 그리고 당신은 그것을 위해'override'를 사용합니다. – Dici

+0

@Dici - M 및 N은 이미 제공했습니다 (P의 경우). –

+0

좋아, 나는 이해한다고 생각한다. 'override'는'O'의 왼쪽에있는 이전의 모든 대안을 제거합니다. 반면에 간단한'def'는 단순히 새로운 대안을 추가합니다 – Dici