在mixin中调用super的行为

Bha*_*tan 0 scala traits

下面的代码显示了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被调用了两次。请解释输出。

Mar*_*lic 5

new AnyRef with X with Y线性化

AnyRef -> Y -> X -> AnyRef -> Any
Run Code Online (Sandbox Code Playgroud)

所以Y.superX。由于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 被打印两次。