2011-04-13 3 views
23

¿Es una buena práctica utilizar la palabra clave override al implementar métodos abstractos definidos en rasgos?Uso de la palabra clave override en implementaciones de métodos abstractos

trait Tooth { 
    def ache(): Unit 
} 

class Molar extends Tooth { 
    override def ache(): Unit = {} 
} 

En el ejemplo anterior, entiendo que la palabra clave de anulación es opcional; pero es aconsejable? ¿De qué lado de la concisión versus compromiso de seguridad debo caer?

+0

argumentativo ... –

+2

@Kim - ¿Cómo, exactamente? –

Respuesta

25

override hace una cosa por usted allí: al eliminar Tooth.ache pero no sus implementaciones más adelante, obtendrá errores de compilación. En particular, esto obliga a las implementaciones de Tooth (escritas por usted o por otros) a estar "cerca" de Tooth en un cierto sentido, a saber, que los métodos obsoletos desaparecen (o al menos son reconsiderados).

Esto puede o no puede ser deseado.

+11

OTOH, si alguien pone algún día una implementación de 'dolor 'dentro de' Tooth', con el objetivo de proporcionar _ la_ eventual solución final, él ni siquiera sabrá que todavía habrá implementaciones antiguas en el código. –

+2

Estoy de acuerdo con esto. He visto numerosos ejemplos de código muerto porque se cambió el nombre de un método abstracto. –

15

Personalmente, cuando veo

override def whatever() 

el primero que pienso es: "Me pregunto cómo se suponía que esto comporte antes?"

Dado que este es un pensamiento inútil si se trataba de un método abstracto, me resulta más seguro y dejarlo así.

7

Siempre lo uso, para indicar el miembro que se declaró en las súper clases, incluso si es abstracto.

+1

Creo que esta es la mejor respuesta (de lejos), pero se limita por ser demasiado breve. Añadiría que una anulación tiene una * intención * muy distinta de un método regular (un nuevo método solo agrega comportamiento, una anulación puede cambiarlo). Y cada vez que se necesita una intención diferente, lo mejor es hacerlo explícito. – rsenna

+1

OTOH, si alguien pone algún día una aplicación de dolor dentro de Tooth, con el objetivo de proporcionar la solución definitiva final, ni siquiera sabrá que todavía habrá implementaciones antiguas en el código. –

12

Normalmente no uso la anulación al implementar un método abstracto. No está mal, pero es redundante, y prefiero mantener mi código lo más corto posible manteniendo la claridad. Pero me doy cuenta de que no es un caso claro.

Cuestiones relacionadas