使用超类/trait实现重写方法



假设我有以下特征:

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 (valdef)的定义不同,因此您必须只选择一个。您应该在两个性状中使用defval(而不是混合使用它们)。

如果您在A trait中设置adef,则可以

class C extends B with A {
  override val a = super.a
}
val c = new C
c.a // "a"

这将工作,因为A是在B之后扩展的,所以super将是它的实现

相关内容

  • 没有找到相关文章

最新更新