我了解 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)
}
上面的代码无法编译。
嗯,并不像你所看到的那样神奇。如果这是一个财产A
类,那么你可以覆盖它 - 通过类线性化,你已经知道,每个with X
, where 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)
}
}
prints
a
b
c
然而,当每个班级介绍自己的班级时x
编译器无法证明可以覆盖其他编译器x
s,那么解决这个问题就交给你了。它还建议了一种解决方案:
object TraitsEx extends App {
var d = new A with B with D { override val x = "d" }
println(d.x)
}
这样你就可以覆盖所有不同的x
s 并消除歧义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)