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
[GC] Giuseppe Attardi, Antonio Cisternino, Polymorphism
Daniele Licari
Nessun commento:
Posta un commento