无法覆盖Scala中的方法

时间:2017-10-04 19:04:19

标签: scala

我有2个特质和1个班级。

在特质A中,A1A2两种方法都需要实施

scala> trait A {
     | def A1
     | def A2
     | }
defined trait A

在trait B中,即使A1在这里实现,它也需要是抽象的,因为它使用了super,它仍然需要在实例类中实现。 A2已实施

scala> trait B extends A {
     | abstract override def A1 = {
     | super.A1
     | }
     | def A2 = println("B")
     | }
defined trait B

现在我有一个C课,它定义A1(与以前的特征无关)

scala> class C {
     | def A1 = println("C")
     | }
defined class C

现在我想创建对象C1,它应该是C类型,但我想要B的一些功能(比如说A2)。但它没有编译。如何在A2中使用B中的C?我认为它会起作用,因为C已经实现了A1

scala> val c1 = new C with B
<console>:13: error: overriding method A1 in class C of type => Unit;
 method A1 in trait B of type => Unit cannot override a concrete member without a third member that's overridden by both (this rule is designed to prevent ``accidental overrides'')
       val c1 = new C with B
                    ^

1 个答案:

答案 0 :(得分:3)

错误会阻止您执行此操作以防止“意外覆盖”。您的A1方法在BC中定义,但对于编译器,它们是无关的,恰好具有相同的类型签名。因此,您必须在对象中提供此方法的重写实现。你可以这样做:

val c1 = new C with B {
  override def A1 = ??? // Add your implementation here.
}