使用超类/特征实现覆盖方法

时间:2015-05-25 08:41:34

标签: scala

假设我有下一个特征:

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
                              ^

2 个答案:

答案 0 :(得分:1)

编译器不可能知道您打算使用哪一个,因此必须将其指定为:

class C extends B with A {
    override def a = super[A].a
}

此方法允许您直接选择父级,无论特征顺序如何。

但是,这些特征以不同的方式定义avaldef)因此您必须只选择一个。您应该在两个特征中使用defval(不要混合它们)。

答案 1 :(得分:0)

如果您在a特质中def A,则可以

class C extends B with A {
  override val a = super.a
}

val c = new C
c.a // "a"

这样做是因为AB后延长了,因此super将是其实现。