解析超级中的Scala线性化

时间:2016-03-10 04:54:59

标签: scala traits

我的编码如下:

trait Base1 {
    def print() { println("Base1") }
}

trait A extends Base1 {
    override def print() { println("A"); super.print() }
}

trait B extends Base1 {
    override def print() { println("B"); super.print() }
}

class Base2 {
    def print() { println("Base2") }
}

class C extends Base2 with A with B {
    override def print() { println("C"); super.print() }
}

object Main extends App {
    (new C).print()
}

我应用了线性化,发现订单为

c >> B >> A >> Base1 >> Base2 >> AnyRef >> Any

我得到了以下输出

C

A

基础1

但是没有调用Base2打印功能。我在这里失踪了什么?

1 个答案:

答案 0 :(得分:2)

如果您查看线性化链,您的super来电链将以Base1结束,而不会调用super.print()。因此,线性化链上的下一个事项,即Base2永远不会调用其print方法。

有趣的是,Base1也无法调用super.print,因为它可以混合到不会线性化的类中,以便为Base祖先提供兼容{ {1}}方法。所以你被print无法自己打印出来了。