从差异特征继承同名方法

jac*_*iao 6 java inheritance scala traits

我有一个特性扩展了两个具有相同名称的函数,但它与内部有点不同,我想知道如何知道将调用哪个函数?

我有特点Bprint(),和特质Cprint(),如果我继承了他们两个这样的:

trait A extends B with C {
    def print()
}
Run Code Online (Sandbox Code Playgroud)

每个打印打印别的东西,哪个打印会被调用?

Yuv*_*kov 6

在您遇到名称冲突的特定情况下,您将收到编译时错误.假设D是实现类:

class D extends A with C with B

def main(args: Array[String]): Unit = {
  val d = new D
  println(d.print())
}
Run Code Online (Sandbox Code Playgroud)

你会看到的:

Error:(25, 9) class D inherits conflicting members:
  method print in trait B of type ()Unit  and
  method print in trait C of type ()Unit
(Note: this can be resolved by declaring an override in class D.)
  class D extends A with B with C
Run Code Online (Sandbox Code Playgroud)

但是,如果我们通过添加override print()to来帮助编译器D,并使其调用super.print(),它将打印支持print方法的linage中的最后一个特征,即:

trait A { }

trait B { def print() = println("hello") }

trait C { def print() = println("world") }

class D extends A with B with C {
  override def print(): Unit = super.print()
}
Run Code Online (Sandbox Code Playgroud)

我们得到"世界".如果我们切换B并且C:

class D extends A with C with B {
  override def print(): Unit = super.print()
}
Run Code Online (Sandbox Code Playgroud)

我们得到"你好".

  • 我只想补充一点,你可以明确地说:`class D extends A with B with C { override def print(): Unit = super[B].print() }`。 (2认同)