2010-04-08 14 views
9

¿Qué significa el siguiente mensaje de error?no puede anular un miembro concreto sin un tercer miembro que está anulado por

no puede anular un elemento de hormigón sin un tercer miembro que es anulado por tanto (esta regla es diseñado para evitar `` accidentales anulaciones '');

Estaba tratando de hacer modificaciones de rasgos apilables. Es un poco después del hecho ya que ya tengo una jerarquía en su lugar y estoy tratando de modificar el comportamiento sin tener que reescribir una gran cantidad de código.

que tienen una clase base llamada AbstractProcessor que define un método abstracto especie de la siguiente manera:

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

Tengo un par de rasgos existentes, para implementar diferentes comportamientos OnPush.

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

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

Así que me permite usar new AbstractProcessor with Pass1 o new AbstractProcessor with Pass2.

Ahora me gustaría hacer algo de procesamiento antes y después de la llamada onPush en Pass1 y Pass2 mientras minimizo los cambios de código a AbstractProcessor y Pass1 y Pass2. Pensé en la creación de un rasgo que hace algo como esto:

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

Y su uso con new AbstractProcessor with Pass1 with Custom y me dieron ese mensaje de error.

Respuesta

11

El problema es que existe ambigüedad entre AbstractProcessor.onPush y . Este último no está anulando el primero porque Pass1 no se extiende AbstractProcessor.

Si realiza Pass1 y Pass2 extiende AbstractProcessor, entonces el problema está resuelto.

+1

En el momento en que recibí su respuesta, descubrí que podía crear un rasgo para onPush y que todo se extendiera. Supongo que me confundí con la "tercera" palabra. Me pregunto si "sin un miembro de base que sea anulado por ambos" daría una mejor pista. – huynhjl

0

Otra solución es tener un rasgo que contiene simplemente:

def onPush(i:Info): Unit 

Y mezclar ese rasgo en AbstractProcessor, Pass1, y Pass2. El compilador ya no intentará evitar una "anulación accidental".

Cuestiones relacionadas