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