2013-08-04 90 views
0

考慮以下幾點:覆蓋爲final類性狀方法斯卡拉

trait TestTrait { 
    def doStuff() 
} 

final class TestClass { 
// ... 
} 

我想實例化實現的特質方法的TestClass的一個實例。以下不編譯:

// Illegal inheritance from final class TestClass 
val t = new TestClass with TestTrait { 
    def doStuff() { 
    println("doing stuff") 
    } 
} 

這是有道理的,因爲創建的匿名類將擴展最終的類。我真正追求的是一個匿名實現混入最終課程實例的特質。

以下的工作,但似乎有點迂迴。有沒有辦法直接做到這一點,沒有宣佈的特質實施?

trait TestTraitImpl extends TestTrait { 
    def doStuff() { 
    println("doing stuff") 
    } 
} 

val t = new TestClass with TestTraitImpl 
+0

我很困惑:問題說「下面的作品」,但它不起作用(即使OP的答案也表示它不)。 – Suma

回答

1

事實證明,你也不能做後者。

final class TestClass 

trait TestTrait 

val t = new TestClass with TestTrait 

顯然,任何Foo with Bar是一個新的匿名類型的創建,從而最終類不能有性狀混入。這對於作出類的最終決策增加了很大的理論意義,因爲它不僅阻止了繼承的概念,而且還防止了可堆疊的修改。

0

方法解析規則在兩種情況下是不同的。在第一種情況一個匿名類是由任何恰好是該類型的方法/屬性第一構造:

final class TestClass with TestTrait 

然後你試圖覆蓋的一個方法,該方法與最終限定符衝突的TestClass。

在第二種情況下,你明確指定要覆蓋TestTrait行爲,然後將被覆蓋的行爲混入識別TestClass。

我認爲使用第二種方法是完全正確的,它更清楚地表達了它的意圖。