【问题标题】:cannot override a concrete member without a third member that's overridden by both无法覆盖没有被两者覆盖的第三个成员的具体成员
【发布时间】:2011-02-05 21:54:35
【问题描述】:

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

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

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

我有一个名为 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 一起使用,我收到了错误消息。

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    另一种解决方案是让 trait 只包含:

    def onPush(i:Info): Unit
    

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

    【讨论】:

      【解决方案2】:

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

      如果你让Pass1Pass2扩展AbstractProcessor,那么问题就解决了。

      【讨论】:

      • 当我得到你的答案时,我发现我可以为 onPush 创建一个特征并让一切都扩展它。我想我被“第三”字弄糊涂了。我想知道“没有被两者覆盖的基本成员”是否会提供更好的线索。
      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多