sabato 22 novembre 2008

Il polimorfismo per inclusione/sottotipi

Il polimorfismo per inclusione/sottotipi è legato fortemente al concetto di ereditarietà. Gli oggetti appartenenti ad una classe derivata appartengono anche alla classe base (quindi la classe derivata è inclusa nella classe base) e ne hanno tutte le proprietà e funzioni, le quali vengono in questo modo riutilizzate per tipi diversi.
La maggior parte dei linguaggi ad oggetti è basata sull'idea che una sottoclasse equivalga ad un sottotipo. Questa idea è spesso ricordata con il nome di Principio di Sostituibilità di Liskov [Lis88].
La definizione data è comportamentale: B è un sottotipo di A se un oggetto di una sottoclasse può essere utilizzato al posto di un'istanza della superclasse, lasciando immutato il comportamento [logico] del programma.
La possibilità che le classi derivate possano ridefinire i metodi e le proprietà dei propri antenati, implica che a seconda del tipo di oggetto su cui è invocato il metodo, oggetti appartenenti alla stessa gerarchia rispondano diversamente alle stesse istruzioni.
Con il polimorfismo subtype bisogna prestare attenzione ai binary methods [BCCLP95], metodi di una classe che prendono come parametri la superclasse, perché possono provocare un comportamento scorretto a run time causato dalla perdita di informazioni sul tipo a compile time. Analizziamo un esempio per intenderci meglio:

Es.3 in Java scriviamo: [GC]

Vector v = new Vector();
v.addElement(new Integer(2));
v.addElement("Pippo");
Integer i = (Integer)v.elementAt(1); // secondo elemento aggiunto

Il parametro del metodo void addElement(Object x) può contenere ogni tipo di oggetti. Quando viene aggiunto un oggetto al vettore si perdono, a compile time, le informazioni sul tipo dell’elemento.
Se tento di castare un elemento con un tipo diverso,come nella riga 4 dell’Esempio 3, Il codice verrebbe compilato senza problemi, ma l’assegnamento a run-time darebbe un errore.

Bibliografia
[BCCLP95] Kim Bruce, Luca Cardelli, Giuseppe Castagna, Gary T. Leavens, Benjamin Pierce, "On Binary Methods", Technical Report, Ecole Normale Supérieure, Paris, 1995.
[Lis88] Barbara Liskov, "Data Abstraction and Hierarchy", ACM SIGPLAN Notices, May 1988.
[GC] Giuseppe Attardi, Antonio Cisternino, Polymorphism

Daniele Licari

Nessun commento: