L’override del metodo viene utilizzato nella programmazione orientata agli oggetti all’interno di una gerarchia di ereditarietà e si verifica quando un metodo definito in una superclasse viene ridefinito in una sottoclasse. Di solito, il metodo della sottoclasse fa qualcosa di diverso dal metodo della superclasse o espande una capacità della superclasse, ma non è necessario che sia così. L’override del metodo si verifica ogni volta che un metodo della superclasse viene ridefinito in una sottoclasse, indipendentemente dal contenuto del metodo ridefinito. Le firme del metodo ridefinite devono essere esattamente le stesse.
Ad esempio, una classe A potrebbe contenere un metodo chiamato “faiQualcosa” e questo metodo non accetta parametri di input. Inoltre, le classi B e C potrebbero essere sottoclassi della classe A. La classe B potrebbe contenere un metodo chiamato “faiQualcosa”, che non accetta parametri di input, e la classe C potrebbe contenere un metodo “faiQualcosa” che accetta un numero come parametro di input. In questo esempio, solo la classe B dimostrerebbe l’override del metodo, perché il suo metodo “doSomething” ha la stessa firma del metodo della sua superclasse, classe A. Il metodo “doSomething” nella classe C, d’altra parte, dimostra l’overload del metodo perché crea un metodo completamente nuovo.
L’ereditarietà virtuale in C++ è un altro esempio di override del metodo. I metodi virtuali nelle superclassi potrebbero o non potrebbero essere implementati, ma qualsiasi loro definizione di sottoclasse è un’istanza di override del metodo. Quando un metodo viene sovrascritto in una sottoclasse, il metodo della superclasse non viene chiamato a meno che non venga invocato esplicitamente. Si dice spesso che questo modo specifico di chiamare un metodo sottoposto a override “nasconda” l’implementazione della superclasse.
Sebbene l’override del metodo sia molto flessibile, non tutti i metodi possono essere ignorati e ci sono momenti in cui questa rigidità potrebbe essere preferibile. Sia in Java che in C++, è possibile applicare parole chiave specifiche nelle firme dei metodi per evitare che un metodo venga sovrascritto in una sottoclasse. Per fare ciò, Java utilizza la parola chiave “final” e C++ utilizza la parola chiave “const”. La prevenzione dell’override del metodo può essere utile se una particolare funzione deve essere sempre invariata in un albero di ereditarietà.
In generale, non è necessario sovrascrivere i metodi semplici che ottengono piccoli pezzi di dati. I casi che tendono a trarre maggiori benefici dall’override sono quando una sottoclasse mira ad aggiungere funzionalità a un metodo della superclasse senza creare un metodo completamente nuovo per farlo. Anche i casi insoliti in cui un metodo deve essere completamente rifatto per un tipo specifico di oggetto potrebbero trarre vantaggio da questa tecnica. Ogni volta che un metodo viene sovrascritto, è importante che il programmatore commenti adeguatamente sia i metodi della superclasse che quelli della sottoclasse. Idealmente, questi commenti dovrebbero chiarire cosa fa ogni variante del metodo, nonché come e perché differiscono.