2011-04-13 18 views
23

È buona norma utilizzare la parola chiave override quando si implementano metodi astratti definiti in tratti?Uso della parola chiave override sulle implementazioni dei metodi astratti

trait Tooth { 
    def ache(): Unit 
} 

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

Nell'esempio precedente, comprendo che la parola chiave override è facoltativa; ma è consigliabile? Da quale lato dovrei cadere la discrezione rispetto alla sicurezza?

+0

argomentativo ... –

+2

@Kim - Come, esattamente? –

risposta

25

override fa una cosa per te lì: quando rimuovi Tooth.ache ma non le sue implementazioni in seguito, riceverai errori del compilatore. In particolare, questo impone le implementazioni di Tooth (scritte da voi stessi o da altri) per essere "vicine" a Tooth in un certo senso, vale a dire che i metodi deprecati svaniscono (o sono almeno riconsiderati).

Questo può o non può essere desiderato.

+11

OTOH, se un giorno qualcuno mette in atto un'implementazione di "dolore" all'interno di "Dente", con lo scopo di fornire l'eventuale soluzione finale, lui/lei non saprà nemmeno che nel codice ci saranno ancora vecchie implementazioni. –

+2

Sono d'accordo con questo. Ho visto numerosi esempi di codice morto perché è stato rinominato un metodo astratto. –

15

Personalmente, quando vedo

override def whatever() 

la prima cosa che penso è: "Mi chiedo come questo doveva comportarsi prima?"

Poiché questo è un pensiero inutile se si trattasse di un metodo astratto, trovo sia più teso e più sicuro di lasciarlo fuori.

7

Lo uso sempre, per indicare membri dichiarati in super classi, anche se astratti.

+1

Credo che questa sia la risposta migliore (di gran lunga), ma si limita ad essere troppo breve. Aggiungo che un override ha un'intenzione * molto distinta * rispetto a un metodo normale (un nuovo metodo aggiunge solo un comportamento, una sostituzione lo modifica potenzialmente). E ogni volta che è necessaria una diversa intenzione, è meglio renderla esplicita. – rsenna

+1

OTOH, se qualcuno, un giorno, mette in atto un'implementazione del dolore all'interno di Tooth, allo scopo di fornire l'eventuale soluzione finale, non saprà nemmeno che nel codice ci saranno ancora vecchie implementazioni. –

12

Di solito non uso l'override quando si implementa un metodo astratto. Non è sbagliato, ma ridondante, e preferisco mantenere il mio codice il più breve possibile pur mantenendo la chiarezza. Ma mi rendo conto che non è un caso chiaro.

Problemi correlati