我的编码如下:
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打印功能。我在这里失踪了什么?
答案 0 :(得分:2)
如果您查看线性化链,您的super
来电链将以Base1
结束,而不会调用super.print()
。因此,线性化链上的下一个事项,即Base2
永远不会调用其print
方法。
有趣的是,Base1
也无法调用super.print
,因为它可以混合到不会线性化的类中,以便为Base
祖先提供兼容{ {1}}方法。所以你被print
无法自己打印出来了。