为什么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调用的CD

在那之后我完全迷失了。我不知道为什么会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


以上是为什么super的这种用法会产生这个结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>