如果没有被两者覆盖的第三个成员,则不能覆盖具体成员

时间:2010-04-08 21:34:46

标签: scala scala-2.8

以下错误消息是什么意思?

  

无法覆盖具体成员   没有第三个成员   被两者所覆盖(这个规则是   旨在防止“意外”   覆盖 '');

我试图做可堆叠的特征修改。这是事后的一点,因为我已经有了一个层次结构,我正在尝试修改行为,而不必重写大量的代码。

我有一个名为AbstractProcessor的基类,它定义了一个类似这样的抽象方法:

abstract class AbstractProcessor {
  def onPush(i:Info): Unit
}

我有几个现有的特征,以实现不同的onPush行为。

trait Pass1 {
  def onPush(i:Info): Unit = { /* stuff */ }
}

trait Pass2 {
  def onPush(i:Info): Unit = { /* stuff */ }
}

这样我就可以使用new AbstractProcessor with Pass1new AbstractProcessor with Pass2

现在我想在Pass1和Pass2中的onPush调用之前和之后进行一些处理,同时最小化对AbstractProcessor和Pass1和Pass2的代码更改。我想创建一个类似这样的特性:

trait Custom extends AbstractProcessor {
  abstract override def onPush(i:Info): Unit = {
    // do stuff before
    super.onPush(i)
    // do stuff after
  }
}

并将其与new AbstractProcessor with Pass1 with Custom一起使用,我收到了错误消息。

2 个答案:

答案 0 :(得分:11)

问题在于AbstractProcessor.onPushPass1.onPush之间存在歧义。后者不会覆盖前者,因为Pass1不会延伸AbstractProcessor

如果您Pass1Pass2延长AbstractProcessor,那么问题就解决了。

答案 1 :(得分:0)

另一个解决方案是拥有一个仅包含:

的特征
def onPush(i:Info): Unit

将该特征混合到AbstractProcessorPass1Pass2中。编译器将不再尝试阻止“意外覆盖”。