|
Overriding e
overloading Quando una sottoclasse ridefinisce un metodo ereditato, si dice che fa un “overriding”. Grazie all’overriding, una classe derivata può avere un’implementazione diversa dalla propria classe base, pur condividendone l’interfaccia. Nel nostro esempio, le classi Ghepardo e Muflone fanno entrambe un overriding del metodo interroga() della classe Animale. Attenzione a non confondere l’overriding con l’overloading, che è un’operazione molto diversa. L’overloading è il “sovraccarico” di significati di un metodo. In pratica, significa che abbiamo più metodi con lo stesso nome, che si distinguono solo per il numero e il tipo dei parametri in ingresso. Ecco un esempio:
In questo caso, la classe Vongola contiene un metodo “overloaded”. Esistono due versioni del metodo interroga(), e il compilatore sceglie di volta in volta la versione giusta in base ai parametri della chiamata. Due metodi con lo stesso nome convivono tranquillamente se hanno parametri in ingresso diversi. Quando usiamo l’overloading dobbiamo sempre ricordare due cose. La prima è che il tipo del parametro in uscita non è sufficiente a distinguere i metodi. Ecco un esempio sbagliato:
Questa classe dà un errore di compilazione, perché una classe non può contenere due metodi con lo stesso nome e gli stessi parametri in ingresso, anche se i due metodi restituiscono tipi diversi. La seconda cosa che dobbiamo ricordare è che due metodi che si distinguono solo per i parametri di ingresso sono, a tutti gli effetti, due metodi diversi, anche se hanno lo stesso nome. Ad esempio, la classe Vongola contiene due versioni del metodo interroga() (e questo è un overloading), e una delle due sostituisce l’implementazione della classe base Animale (questo è un overriding). Quindi possiamo usare overriding e overloading insieme, a patto di non fare confusione: la versione di interroga() che non prende parametri in ingresso è quella che si ritrova nell’interfaccia di Animale, mentre la versione che accetta un intero è un metodo diverso e completamente nuovo aggiunto dalla classe Vongola |