2012-12-26 107 views
1

我試圖定義一個特質C延伸部分性狀AB,...所有特質,CAB,...實現一個共同的特點T。特質C應該通過調用T的實現在AB實施T,..:斯卡拉性狀和名稱衝突的抽象類型

trait T{ 
    def f() 
} 
trait A extends T{ 
    def f(){ 
    print("A") 
    } 
} 
trait B extends T{ 
    def f(){ 
    print("B") 
    } 
} 

特質C的期望的行爲如下:

val x=new A with B with C[A,B]{} 
x.f() 
// should produce output 
A 
B 

這裏我試圖定義性狀C,這給編譯錯誤:

trait C[A<:T,B<:T] extends T{ 
    self:A with B => 
    override def f(){ 
    // error: A does not name a parent class of trait C 
    super[A].f() 
    // error: B does not name a parent class of trait C 
    super[B].f() 
    } 
} 

我需要撥打C方法A.f()B.f()。 有沒有解決這個問題的方法?

回答

2

如果你想提供一種方式的特徵內部,而且也保證了子類實現的定義,就可以告訴這個編譯器與abstract override組合:

trait T { 
    def f() 
} 
trait A extends T { 
    abstract override def f() { 
    super.f() 
    print("A") 
    } 
} 
trait B extends T { 
    abstract override def f() { 
    super.f() 
    print("B") 
    } 
} 

trait C extends T { 
    override def f() { 
    // do your work here ... 
    } 
} 

val x = new C with A with B 
x.f() 

呼叫在未來實現在混合層級中,您必須在abstract override方法調用中添加一個super.f()調用。因爲這樣的超級調用需要現有的實現,所以需要創建的第一件事是C的實例,其混合了AB。如果混入C,AB,編譯器會抱怨,因爲mixin層次結構是從左到右執行的,因此無法看到C的實現。