2010-04-08 6 views
9

Was bedeutet die folgende Fehlermeldung?kann ein konkretes Element ohne ein drittes Element, das von beiden überschrieben wird, nicht überschreiben

kann kein konkretes Element außer Kraft setzen ohne ein drittes Element, das durch beide außer Kraft gesetzt ist (diese Regel ist zu verhindern `` entworfen versehentliche Überschreibungen ‚‘);

Ich habe versucht, stapelbare Modifizierungen durchzuführen. Es ist ein wenig nach der Tatsache, da ich bereits eine Hierarchie an Ort und Stelle habe und ich versuche, das Verhalten zu ändern, ohne viel Code neu schreiben zu müssen.

Ich habe eine Basisklasse namens AbstractProcessor, die eine abstrakte Methode Art wie diese definiert:

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

Ich habe ein paar vorhandenen Züge, verschiedene OnPush Verhalten zu implementieren.

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

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

Damit ermöglicht es mir new AbstractProcessor with Pass1 oder new AbstractProcessor with Pass2 zu verwenden.

Jetzt möchte ich vor und nach dem onPush-Aufruf in Pass1 und Pass2 einige Verarbeitung vornehmen, während Codeänderungen auf AbstractProcessor und Pass1 und Pass2 minimiert werden. Ich dachte, ein Merkmal zu schaffen, die so etwas wie dies funktioniert:

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

und dessen Verwendung mit new AbstractProcessor with Pass1 with Custom und ich bekam die Fehlermeldung.

Antwort

11

Das Problem ist, dass zwischen AbstractProcessor.onPush und Pass1.onPush eine Mehrdeutigkeit besteht. Letzteres überbrückt das erstere nicht, weil Pass1 nicht AbstractProcessor verlängert.

Wenn Sie Pass1 und Pass2 erweitern AbstractProcessor machen, dann ist das Problem gelöst.

+1

Als ich Ihre Antwort bekam, fand ich heraus, dass ich ein Merkmal für onPush erstellen konnte und alles erweitern konnte. Ich glaube, ich wurde durch das "dritte" Wort verwirrt. Ich frage mich, ob "ohne ein Basismitglied, das von beiden überschrieben wird", einen besseren Hinweis geben würde. – huynhjl

0

Eine andere Lösung ist es, ein Merkmal zu haben, die nur enthält:

def onPush(i:Info): Unit 

Und dieses Merkmal mischen in AbstractProcessor, Pass1 und Pass2. Der Compiler wird nicht mehr versuchen, eine "versehentliche Überschreibung" zu verhindern.

Verwandte Themen