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
无法打印出来的困境。
我编码如下:
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
无法打印出来的困境。