我们应该总是在Trait中使用`override`

Yan*_*san 3 scala diamond-problem

我们是否应该始终使用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
Run Code Online (Sandbox Code Playgroud)

没有override,以下不编译.

Gab*_*lla 10

使用override会使它编译,但真正的问题是:你想要实现什么?

在scala中,您扩展的特征是线性化的.这意味着

class C extends A with B
new C().get
Run Code Online (Sandbox Code Playgroud)

会产生 "B"

class C extends B with A
new C().get
Run Code Online (Sandbox Code Playgroud)

会产生"A"反而.

那么你期待什么?一般来说,根据解决钻石问题的继承顺序似乎是一个糟糕的设计选择(虽然有这种语言功能的合法用途,如可堆叠的特征模式)

那么,回到最初的问题,你应该总是使用覆盖吗?不,你应该在继承层次结构中避免使用钻石.

  • @abatyuk对,错误的措辞.我的意思是解决钻石问题,当然这个功能有合法用途.更新了我的回答 (2认同)