특성이 메소드의 누락 된 구현을 대체하는 대신 대체되어야하는 경우 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
, 무슨 계산 그럼 잘 끝납니다. O
이 m
의 구현을 (그것을 할 필요가있는 경우 오버라이드 (override) 할 수있는) 제공하지만, N
다음 다른 적용을 시도하고,이 오버라이드 (override) 할 수 없습니다 때문에 그래서
class R extends O with N
은 작동하지 않습니다. 비록
M
및
N
모두
m
에 대한 구현을 제공하려고하기 때문에 한편
,
P
은 괜찮
O
지난 제공과 그 구현이 오버라이드 (override) 함을 선언합니다. 그렇게하면 모든 것이 잘됩니다.
나는 아직도 그것을 얻지 못한다.'누락 된 구현을 제공하는 것이 아니라'그것이 무엇을하지 않는가? 그리고 당신은 그것을 위해'override'를 사용합니다. – Dici
@Dici - M 및 N은 이미 제공했습니다 (P의 경우). –
좋아, 나는 이해한다고 생각한다. 'override'는'O'의 왼쪽에있는 이전의 모든 대안을 제거합니다. 반면에 간단한'def'는 단순히 새로운 대안을 추가합니다 – Dici