4. Ereditarietà
L'ereditarietà risulta indispensabile per processi di modellazione
molto importanti nella moderna costruzione del software quali la specializzazione
e la generalizzazione.
Nella sua forma pi semplice, l'ereditarietà (inheritance)
un meccanismo che consente ad una classe di considerarsi erede di un'altra,
detta classe padre o genitore (parent class), con una
dichiarazione che possiamo assumere del tipo:
classe
<nome> eredita da <classe padre>Cos facendo la classe <nome>, detta classe figlia (o classe derivata), eredita tutte le proprietà della <classe padre> specificata : tutti gli attributi e i metodi (anche quelli nascosti).
Sono state proposte varie notazioni grafiche per rappresentare una relazione di ereditarietà tra classi. Una delle pi semplici la seguente, in cui la relazione rappresentata da un arco diretto dalla classe figlia alla classe padre. Rappresentando l'insieme delle relazioni di questo genere si ottiene il grafo di ereditarietà
Da un punto di vista pratico si può ereditare da qualsiasi classe, a patto di non introdurre cicli nel grafo di ereditarietà. Tuttavia, come suggerito dai nomi delle classi della figura, da un punto di vista metodologico opportuno e consigliato ereditare X da Y solo quando si certi che tra Y e X esiste una relazione Y IS-A X ("Y un X"), o in altri termini, quando la classe figlia una specializzazione di quella padre.
|
Oltre a ereditare, la classe figlia può:
·
aggiungere propri attributi o metodi·
ridefinire (overriding) metodi ereditatiIn questo caso il metodo ereditato (metodo precursore) e quello ridefinito hanno lo stesso nome. I linguaggi devono predisporre meccanismi linguistici opportuni per consentire all'implementatore della classe di accedere ai precursori di un metodo di qualsiasi livello. Si intende che gli utenti della classe si riferiranno a quello ridefinito.
Si osservi che per ogni classe rimane definito l'insieme dei sui discendenti (supertipi) e dei sui discendenti (sottotipi).
Molti linguaggi ad oggetti consentono solo l'ereditarietà semplice:
ogni classe ha al massimo un padre. La classificazione degli oggetti quindi
strettamente gerarchica. Se esiste un'unica radice questa ha nomi come Object
o ANY.
I linguaggi ad oggetti pi evoluti consentono l'ereditarietà multipla:
ciò la possibilità per una classe di ereditare da pi di una classe (ciò di avere
pi padri). Sorgono per problemi non banali di ereditarietà ripetuta:
esiste ciò la possibilità di ereditare pi di un metodo con lo stesso nome e
occorre risolvere in qualche modo le ambiguità che si vengono a creare.