Programmazione orientata agli oggetti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
- NPE in Java (perché non c'entra con il resto del paragrafo)
Riga 69:
==Polimorfismo==
 
La possibilità che le classi derivate implementino in modo differente i metodi e le proprietà dei propri antenati rende possibile che gli oggetti appartenenti a delle sottoclassi di una stessa classe rispondano diversamente alle stesse istruzioni. Ad esempio in una gerarchia in cui le classi Cane e Gatto discendono dalla superclasse Animale potremmo avere il metodo cosaMangia() che restituisce la stringa "ossocarne" se eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I metodi che vengono ridefiniti in una sottoclasse sono detti "'''polimorfi'''", in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato.
 
In linguaggi in cui le variabili non hanno tipo, come [[Ruby]], [[Python]] e [[Smalltalk]] è possibile richiamare un qualsiasi metodo su di un qualsiasi oggetto, sebbene ciò comporti la possibilità di errori a run-time, che in particolare sorgono quando l'oggetto non dispone del metodo che si cerca di invocare.
Tali errori sono eliminabili da linguaggi puramente statici, in quanto essi vengono "scovati" già a compile-time.
 
Le buone regole di programmazione ad oggetti prevedono che quando una classe derivata ridefinisce un metodo, il nuovo metodo abbia la stessa semantica di quello ridefinito, dal punto di vista degli utenti della classe. Nell'esempio di cui sopra, se le specifiche della classe Animale asseriscono che il metodo cosaMangia() deve restituire una stringa di non più di 20 caratteri, allora le classi Cane e Gatto dovranno rispettare tale regola. In caso contrario, un ''client'' che utilizzi un oggetto Cane o Gatto tramite il tipo Animale (faccia, cioè, l'''upcasting'' dell'oggetto) potrebbe ottenere un risultato non desiderato e ciò potrebbe generare a run-time errori difficili da scovare.
 
====Binding dinamico====