2010-04-08 4 views
9

Cosa significa il seguente messaggio di errore?non può ignorare un membro di cemento senza un terzo membro che è ignorata da entrambi

non può escludere un membro concreto senza un terzo membro che è ignorato da entrambi (questa regola è progettato per impedire `` accidentali override '');

Stavo cercando di eseguire modifiche di tratti impilabili. È un po 'dopo che ho già una gerarchia e sto cercando di modificare il comportamento senza dover riscrivere un sacco di codice.

Ho una classe di base denominata AbstractProcessor che definisce un metodo astratto un po 'come questo:

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

Ho un paio di tratti esistenti, ad attuare comportamenti diversi OnPush.

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

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

In modo che mi permette di usare new AbstractProcessor with Pass1 o new AbstractProcessor with Pass2.

Ora mi piacerebbe eseguire alcune elaborazioni prima e dopo la chiamata onPush in Pass1 e Pass2 riducendo al minimo le modifiche al codice in AbstractProcessor e Pass1 e Pass2. Ho pensato di creare una caratteristica che fa qualcosa di simile:

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

E utilizzarlo con new AbstractProcessor with Pass1 with Custom ed ho ottenuto che il messaggio di errore.

risposta

11

Il problema è che c'è ambiguità tra AbstractProcessor.onPush e Pass1.onPush. Quest'ultimo non è overridding il primo perché Pass1 non estende AbstractProcessor.

Se si effettua Pass1 e Pass2 estendere AbstractProcessor, il problema è risolto.

+1

Nel momento in cui ho ottenuto la risposta ho capito che avrei potuto creare un tratto per onPush e avere tutto ciò che estende. Immagino di essere stato confuso dalla "terza" parola. Mi chiedo se "senza un membro di base che è sopravvissuto da entrambi" darebbe un indizio migliore. – huynhjl

0

Un'altra soluzione è quella di avere una caratteristica che contiene solo:

def onPush(i:Info): Unit 

E mescolare quel tratto in AbstractProcessor, Pass1 e Pass2. Il compilatore non tenterà più di impedire un "override accidentale".