在 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 Ylinearised

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 打印两次。