我们是否应该始终使用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"
。
那你期望什么?一般来说,根据继承的顺序来解决钻石问题似乎是一个糟糕的设计选择(尽管该语言功能有合理的用途,例如可堆叠的特征模式)
因此,回到原始问题,您是否应该始终使用覆盖?不,您只应该在继承层次结构中避免使用菱形。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句