我们应该总是在 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"

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

将产生 "A" 代替。

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

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

关于scala - 我们应该总是在 Trait 中使用 `override`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26635098/

10-12 17:31