为什么super的这种用法会产生这个结果
我有以下代码片段:
trait A {
def print = {
println("A")
}
}
trait B {
def print = {
println("B")
}
}
trait C extends A with B {
override def print = {
println("C");
super.print
}
}
trait D extends B with A {
override def print = {
println("D");
super.print
}
}
class E extends D with C {
override def print = {
println("E");
super.print
}
}
哪个打印:
- 乙
- C
- D
- 一种
我的理解是:E
首先继承D
并覆盖它的print
. C
然后优先D
,因为它是后来施加某种方式super
调用的C
点D
。
在那之后我完全迷失了。我不知道为什么会A
被调用,但不会被调用B
。
特征继承和覆盖的处理方式是否与类不同?
回答
从这个声明开始:
class E extends D with C
这读作
class E extends (D with C)
那么类层次结构中D
和的顺序是什么C
?
将trait
C
被应用到D
,因此它可以改变的行为D
。因此它必须继承自 D
,所以这被读作
class E extends C extends D
同样
class C extends B extends A
class D extends A extends B
因此
class E extends C extends B extends A extends D extends A extends B
但是一个类在继承链中只能出现一次,并且是最高(最少派生)的版本被保留下来。所以这变成
class E extends C extends D extends A extends B
此层次结构与您在调用print
的实例时看到的输出相匹配E
。