2014-10-29 79 views
3

我們是否應該始終在特質中使用override來預先解決鑽石繼承問題?我們是否應該始終在特質中使用`override`

讓我們看一個例子來說明這一點:

trait S { def get : String } 
trait A extends S { override def get = "A" } 
trait B extends S { override def get = "B" } 
class C extends A with B 

沒有override,以下不編譯。

+2

你會期望'new C()。get'返回什麼? – 2014-10-29 16:04:02

+0

這聽起來像是一種簡單的方法,如果相似的特徵相互重疊,會產生意想不到的結果。我認爲更好的問題是,在什麼情況下,你會用'A'和'B'想要''C'? – 2014-10-29 16:07:07

回答

10

使用override將使它編譯,但真正的問題是:你想達到什麼?

在scala中,你正在擴展的特徵是線性化的。這意味着,

class C extends A with B 
new C().get 

會產生"B"

class C extends B with A 
new C().get 

會產生"A"代替。

那麼你期望什麼?一般來說,取決於解決鑽石問題的繼承順序似乎是一個可怕的設計選擇(雖然有這種語言功能的合法使用,如可堆疊特質模式)

因此,回到原來的問題,你應該總是使用覆蓋?不,您應該避免在繼承層次結構中使用鑽石。

+1

還有可堆疊的特質模式,可以從訂單中受益(http://www.artima.com/scalazine/articles/stackable_trait_pattern.html),但可能不是'糟糕的設計選擇' – abatyuk 2014-10-29 16:31:31

+2

@abatyuk正確,錯誤的措辭。我的意思是解決鑽石問題,當然這種功能有合法用途。更新了我的答案 – 2014-10-29 16:33:34

相關問題