Ereditarietà (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m tag obsoleti
Riga 16:
 
; Violazione del principio di sostituibilità
Nonostante tutto, in genere è tecnicamente possibile estendere una classe violando il principio di sostituibilità, in quanto le regole imposte dal linguaggio di programmazione in uso non possono andare oltre la correttezza ''formale'' del codice scritto ed eventualmente la sua aderenza a determinate precondizioni o postcondizioni. In certi casi, il principio viene violato intenzionalmente<ref name="java.util.IdentityHashMap">Esempio in Java: la classe <ttcode>[http://download.oracle.com/javase/6/docs/api/java/util/IdentityHashMap.html java.util.IdentityHashMap]</ttcode>, appartenente alle librerie standard del linguaggio, viola intenzionalmente il contratto generale stabilito dal tipo <ttcode>java.util.Map</ttcode>, ma, come si vede dalla documentazione della stessa, il fatto che il contratto generale dell'interfaccia <ttcode>Map</ttcode> sia violato è ben documentato.</ref>; tuttavia, quando succede, è opportuno che si documenti la cosa in modo appropriato, onde evitare che le istanze della classe siano usate dove si assume valido il citato principio di sostituibilità<ref name="java.util.IdentityHashMap"/>.
 
; Polimorfismo
Riga 48:
=== Ridefinizione ===
{{vedi anche|Overriding}}
Molti linguaggi di programmazione ad oggetti permettono ad una classe o ad un oggetto di modificare il modo in cui è implementata una propria funzionalità ereditata da un'altra classe (di solito un metodo). Questa caratteristica è chiamata "ridefinizione" (in inglese, ''overriding''). A fronte di overriding, lo stesso metodo avrà un comportamento diverso se invocato sugli oggetti della superclasse o in quelli della sottoclasse (per lo meno nel caso dei linguaggi che adottano il [[binding dinamico]]). Ad esempio, data una classe <ttcode>Quadrilatero</ttcode> che definisce alcuni comportamenti generali per tutte le figure geometriche con 4 lati, la sottoclasse <ttcode>Rettangolo</ttcode> potrebbe ridefinire (ovvero "fare overriding di") quei metodi di <ttcode>Quadrilatero</ttcode> che possono essere reimplementati in maniera più specifica tenendo conto delle specificità dei rettangoli (per esempio, il calcolo dell'area potrebbe essere riscritto nella classe <ttcode>Rettangolo</ttcode> in modo più semplice ed efficiente semplicemente come prodotto dei lati).
 
=== Estensione ===
Riga 55:
 
=== Riutilizzo del codice ===
Uno dei principali vantaggi dell'uso dell'ereditarietà (in particolare combinata col polimorfismo) è il fatto di favorire il [[riuso di codice]]. Non solo una sottoclasse ''eredita'' (e quindi riusa) il codice della superclasse: il polimorfismo garantisce anche che tutto il codice precedentemente scritto per manipolare oggetti della superclasse sia anche implicitamente in grado di manipolare oggetti della sottoclasse. Per esempio, un programma che sia in grado di rappresentare graficamente oggetti di classe <ttcode>Quadrilatero</ttcode> non avrebbe bisogno di alcuna modifica per trattare analogamente anche oggetti di una eventuale classe <ttcode>Rettangolo</ttcode>.
 
== Esempi ==