2017-10-04 47 views
0

我有2個特徵和1個類。無法重寫Scala中的方法

在特質A,這兩種方法A1A2需要執行

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

在特質B,即使A1在這裏實現,它需要是抽象的,因爲它使用的超級,它仍然需要實例類實現。 A2實現

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

現在我有一個類C定義A1(不涉及以前的性狀)

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

現在我要創建的對象C1這應該是C型的,但我想一些功能B以及(如A2)。但它不編譯。我如何使用A2 from B in C?我認爲它會工作,因爲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. 
}