在 mixin 中调用 super 的行为
beahviour of calling super in mixin
下面的代码显示了 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
代码的输出是
Y
X
4
9
X
4
我读过混合两个或多个特征的用法显示了从最右边到左边开始的可堆叠行为,并且调用 super() 是使用线性化解决的。但是从输出来看,似乎 X 被调用了两次。请解释输出。
new AnyRef with X with Y
是 linearised 和
AnyRef -> Y -> X -> AnyRef -> Any
所以Y.super
指的是X
。由于 super
在
中被调用了两次
trait Y extends A {
override def a = {
println("Y")
println((super.a + 5).toString) // <-- here
super.a + 5 // <-- and here
}
}
X
打印两次。
下面的代码显示了 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
代码的输出是
Y
X
4
9
X
4
我读过混合两个或多个特征的用法显示了从最右边到左边开始的可堆叠行为,并且调用 super() 是使用线性化解决的。但是从输出来看,似乎 X 被调用了两次。请解释输出。
new AnyRef with X with Y
是 linearised 和
AnyRef -> Y -> X -> AnyRef -> Any
所以Y.super
指的是X
。由于 super
在
trait Y extends A {
override def a = {
println("Y")
println((super.a + 5).toString) // <-- here
super.a + 5 // <-- and here
}
}
X
打印两次。