Scala Traits 中的冲突字段

Sud*_*dha 4 scala

我了解 scala 如何通过考虑所提到的特征的顺序来解决钻石继承情况。我很好奇它如何解决字段的相同问题。这就是我想要理解的 -

class A {print("A")}
trait B extends A {print("B") ; val x="b"}
trait C extends B {print("C")}
trait D extends A {print("D");  val x="d"}

object TraitsEx extends App {
  var d = new A with B with D
  println(d.x)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码无法编译。

Mat*_*zok 5

嗯,并不像你所看到的那样神奇。如果这是类的属性A,那么您可以覆盖它 - 通过类线性化,您已经知道, every with X,其中X extends A将覆盖值:

trait A {
  val x = "a"
}

trait B extends A {
  override val x = "b"
}

trait C extends A {
  override val x = "c"
}

object Main {
  def main(args: Array[String]): Unit = {
    println((new A {}).x)
    println((new A with B).x)
    println((new A with B with C).x)
  }
}
Run Code Online (Sandbox Code Playgroud)

印刷

a
b
c
Run Code Online (Sandbox Code Playgroud)

但是,当每个类引入自己的类时x,编译器无法证明可以覆盖其他x类,那么它将把解决该问题的工作留给您。它还建议了一种解决方案:

object TraitsEx extends App {
  var d = new A with B with D { override val x = "d" }
  println(d.x)
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以覆盖所有不同的xs 并消除歧义。