2017-10-04 2 views
0

2 개의 특성과 1 개의 클래스가 있습니다. 특성 A에서스칼라에서 메서드를 재정의 할 수 없습니다.

, 두 가지 방법 A1 여기에 구현되어 있지만 특성 B에서

scala> trait A { 
    | def A1 
    | def A2 
    | } 
defined trait A 

는, 그것이 슈퍼 사용하고 여전히 인스턴스 클래스의 구현을 필요로 추상적 할 필요가 A1A2 필요 구현 . A2 내가 지금은 유형 C이어야 객체 C1를 만들

scala> class C { 
    | def A1 = println("C") 
    | } 
defined class C 

(이전의 특성과 관련이없는) A1을 정의하는 클래스 C을 가지고 있지만 좀 원하는 이제

scala> trait B extends A { 
    | abstract override def A1 = { 
    | super.A1 
    | } 
    | def A2 = println("B") 
    | } 
defined trait B 

를 구현 B의 기능도 제공합니다 (예 : A2). 그러나 컴파일되지 않습니다. BA2C에 어떻게 사용할 수 있습니까? C이 이미 A1을 구현했기 때문에 효과가 있다고 생각합니다.

scala> val c1 = new C with B 
<console>:13: error: overriding method A1 in class C of type => Unit; 
method A1 in trait B of type => Unit cannot override a concrete member without a third member that's overridden by both (this rule is designed to prevent ``accidental overrides'') 
     val c1 = new C with B 
        ^

답변

3

"우발적 인 재정의"를 방지하기 위해 오류가 발생합니다. A1 메서드는 BC에 모두 정의되어 있지만 컴파일러에는 관련이없고 같은 형식의 서명이 있습니다. 따라서 객체에서이 메서드의 재정의 된 구현을 제공해야합니다. 다음과 같이 할 수 있습니다.

val c1 = new C with B { 
    override def A1 = ??? // Add your implementation here. 
} 
관련 문제