假设我有下一个特征:
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
^
答案 0 :(得分:1)
编译器不可能知道您打算使用哪一个,因此必须将其指定为:
class C extends B with A {
override def a = super[A].a
}
此方法允许您直接选择父级,无论特征顺序如何。
但是,这些特征以不同的方式定义a
(val
和def
)因此您必须只选择一个。您应该在两个特征中使用def
或val
(不要混合它们)。
答案 1 :(得分:0)
如果您在a
特质中def
A
,则可以
class C extends B with A {
override val a = super.a
}
val c = new C
c.a // "a"
这样做是因为A
在B
后延长了,因此super
将是其实现。