假设我有以下特征:
trait A {
val a: String = "a"
}
trait B {
def a: String = "b"
}
我想把这两种性状混合成一类C
class C extends B with A
编译器不允许我创建这样的类,因为我必须重写方法a
我想覆盖它,例如只使用A
的实现。我该怎么做呢?
编辑
scala> class C extends B with A {
| override val a = super.a
| }
<console>:10: error: super may be not be used on value a
override val a = super.a
^
编译器不可能知道您打算使用哪一个,因此您必须这样指定:
class C extends B with A {
override def a = super[A].a
}
这种方法允许你直接选择父级,而不考虑性状的顺序。
然而,这些性状对a
(val
和def
)的定义不同,因此您必须只选择一个。您应该在两个性状中使用def
或val
(而不是混合使用它们)。
如果您在A
trait中设置a
为def
,则可以
class C extends B with A {
override val a = super.a
}
val c = new C
c.a // "a"
这将工作,因为A
是在B
之后扩展的,所以super
将是它的实现