Scala 线性化解决超级问题

Scala Linearization in resolving super

我编码如下:

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

B

一个

Base1

但是没有调用 Base2 打印函数。我在这里错过了什么??

如果您查看您的线性化链,您的 super 调用链结束于 Base1,它不会调用 super.print()。因此,线性化链上的下一件事,即 Base2 永远不会调用其 print 方法。

有趣的是,Base1 也不可能调用 super.print,因为它可以混合到 类 中,而 类 不会以某种方式线性化,例如 Base具有兼容 print 方法的祖先。所以你陷入了 Base2 无法打印出来的困境。