我们是否应该始终在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
,则以下内容无法编译。
答案 0 :(得分:10)
使用override
会使其编译,但真正的问题是:你想要实现什么目标?
在scala中,您正在扩展的特征是线性化的。这意味着
class C extends A with B
new C().get
将生成"B"
但
class C extends B with A
new C().get
将生成"A"
。
那么你期待什么?一般来说,根据解决钻石问题的继承顺序似乎是一个糟糕的设计选择(虽然有这种语言功能的合法用途,如可堆叠的特征模式)
那么,回到最初的问题,你应该总是使用覆盖吗?不,你应该在继承层次结构中避免使用钻石。