2010-04-08 60 views
9

以下错误消息是什么意思?如果没有第三个成员被第二个成员覆盖,则不能覆盖具体成员

不能覆盖混凝土构件 未经第三构件这是 由两个覆盖(该规则 设计成防止``意外 覆盖“”);

我试图做堆叠性状修改。这是有点后,因为我已经有了一个层次结构,我试图修改行为,而不必重写很多代码。

我有一个名为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和我得到的错误消息。

回答

11

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

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

+1

当我得到你的答案时,我想出了我可以为onPush创建一个特性,并且让所有的东西都得到扩展。我想我被“第三”一词弄糊涂了。我想知道,如果没有两个都被重写的基础成员,会给出更好的线索。 – huynhjl 2010-04-09 13:27:33

0

另一个解决方案是有一个包含只是一个特质:

def onPush(i:Info): Unit 

这特质混入AbstractProcessorPass1Pass2。编译器将不再试图阻止“意外覆盖”。