2010-04-08 90 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。編譯器將不再試圖阻止「意外覆蓋」。