鉴于两个独立的特征:
trait T1 {
def x = 42
}
trait T2 {
def x = 0
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试定义一个混合在这两个特征中的类,如:
class C extends T1 with T2
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
error: overriding method x in trait T1 of type => Int;
method x in trait T2 of type => Int needs `override' modifier
class C extends T1 with T2
^
one error found
Run Code Online (Sandbox Code Playgroud)
现在假设T1和T2是独立开发的,因此没有覆盖,因为它们不会覆盖任何东西.那么如何定义C?像这样:
class C extends T1 with T2 {
override def x = super.x
}
Run Code Online (Sandbox Code Playgroud)
?
Mic*_*mer 10
这被称为钻石问题.在Scala中有两种方法可以解决这个问题:
trait T1 {
def x = 0
}
trait T2 {
def x = 42
}
class C extends T1 with T2 {
override def x = super.x
}
class D extends T2 with T1 {
override def x = super.x
}
Run Code Online (Sandbox Code Playgroud)
如果你new C().x现在打电话,你会得到,42因为Scala使用你最后混合的特性的实现.new D().x将0顺便屈服.这意味着,为了解决钻石问题,您必须明确定义要使用的实现.
另一种方式如下:
trait T {
def x: Int
}
trait T1 extends T {
override def x = 0
}
trait T2 extends T {
override def x = 42
}
class C extends T1 with T2
Run Code Online (Sandbox Code Playgroud)
的调用new C().x仍然会产生42,因为T2是最后的性状的混合.不同的是,你没有定义x的C.
| 归档时间: |
|
| 查看次数: |
314 次 |
| 最近记录: |