Scala 我们应该在Trait中始终使用'override'吗

Scala 我们应该在Trait中始终使用'override'吗,scala,diamond-problem,Scala,Diamond Problem,我们是否应该始终在Trait中使用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,以下内容将无法编译。使用override将使其编译,但真正的问题是:您

我们是否应该始终在Trait中使用
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
,以下内容将无法编译。

使用
override
将使其编译,但真正的问题是:您试图实现什么

在scala中,从中延伸出来的特征是线性化的。这意味着

class C extends A with B
new C().get
将产生
“B”

但是

将生成
“A”

那么你期待什么呢?一般来说,依靠继承的顺序来解决菱形问题似乎是一个糟糕的设计选择(虽然这种语言特性有合法的用途,比如堆叠特征模式)


那么,回到最初的问题,您是否应该始终使用覆盖?不,您只需要在继承层次结构中避免菱形

您希望
new C().get
返回什么?如果相似的特征相互覆盖,那么这听起来是一种产生意外结果的简单方法。我认为更好的问题是,在什么情况下,你会想要
C
A
B
?仍然存在可堆叠的特征模式,可以从顺序中受益(),但可能不是一个“糟糕的设计选择”@abatyuk正确,错误的措辞。我的意思是为了解决钻石问题,当然这一功能也有合法的用途。更新了我的答案
class C extends B with A
new C().get