下面的代码显示了mixin。
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
println((super.a + 3).toString)
super.a + 3
}
}
trait Y extends A{
override def a = {
println("Y")
println((super.a + 5).toString)
super.a + 5
}
}
val xy = new AnyRef with X with Y
xy.a
Run Code Online (Sandbox Code Playgroud)
代码的输出是
Y
X
4
9
X
4
Run Code Online (Sandbox Code Playgroud)
我已经读过混合两个或多个特征的用法,显示从最右边到最左边开始的可堆叠行为,并使用线性化解决了对super()的调用。但是从输出来看,似乎X被调用了两次。请解释输出。
new AnyRef with X with Y是线性化的
AnyRef -> Y -> X -> AnyRef -> Any
Run Code Online (Sandbox Code Playgroud)
所以Y.super指X。由于super被两次调用
trait Y extends A {
override def a = {
println("Y")
println((super.a + 5).toString) // <-- here
super.a + 5 // <-- and here
}
}
Run Code Online (Sandbox Code Playgroud)
X 被打印两次。
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |