La caratterizzazione comune nel polimorfismo universale è data dalla possibilità di scrivere codice che può operare su un numero differente di tipi, purché questi rispettino alcune proprietà e, a partire da questo vincolo, viene fatta la distinzione in due ulteriori sotto-categorie: Parametriche (che usa parametri generici) e Inclusione(corrisponde al polimorfismo subtype nei linguaggi orientati ad oggetti).

Polimorfismo parametrico
L’idea che sta alla base del polimorfismo parametrico è quella di riconoscere che il tipo di alcuni parametri può essere a sua volta un parametro.
Il tipo dei parametri di classe/funzione generica viene fissato durante il processo di istanziazione al momento della compilazione (static binding).
In C++ scriveremo:
Es.1
template< class T >
T max( const T& a, const T& b)
{
if ( a < b ) then return ( b );
else return( a ) ;
}
per indicare una famiglia di funzioni, parametrizzate sul tipo T, che possono scambiare elementi di tipo T.
Il nostro esempio ci consente di introdurre un altro concetto che sta al centro di una controversa discussione tra gli studiosi in materia, ovvero il polimorfismo parametrico con “genericità con vincoli impliciti “(rappresentata dal C++) e, d’altra parte, con “genericità con vincoli espliciti “(rappresentata da Ada, Effeil).[PES96]
La funzione max( T a, T b )(Es.1) deve supporre che sul tipo T esista una relazione d'ordine, quindi assume in modo implicito che l’operatore “<” sia definito, considerando che il compilatore C++ non può fare assunzione sulla natura dei tipi parametrici. L'approccio implicito permette di non imporre alcun vincolo aggiuntivo tranne quelli strettamente necessari affinché il codice compili, ai fini di rendere il codice generico più flessibile, ma anche potenzialmente più insicuro. Alcuni linguaggi come Ada ci consentono di dichiarare le proprietà di un tipo in modo esplicito. Ad esempio nella funzione max(T a,T b) rendiamo noto esplicitamente cosa ci aspettiamo che sia disponibile per il tipo T, dichiarando come ulteriore parametro la funzione “<”. Es.2 in Ada scriveremo:
generic( type T, function "<"(u,v : T) return BOOLEAN )
function max( a, b : T )
return T is begin if( a < b ) then return( b ) ;
else return( a ) ;
end max ;
Richiediamo quindi come parametro una funzione "<", che prende due parametri di tipo T e restituisce un booleano. Se il Tipo non è definito per la funzione Max avremmo un errore a tempo di compilazione. Infine esistono linguaggi, come Eiffel, che consentono l’utilizzo del polimorfismo parametrico solo quando non esistono vincoli sui parametri, scavalcando quanto posto nel dibattito tra vincoli espliciti o impliciti.
Bibliografia
[CW85] Luca Cardelli, Peter Wegner, "On Understanding Types, Data Abstraction, and Polymorphism", ACM Computer Surveys, December 1985.
[PES96] Dr. Carlo Pescio, Programmazione ad Oggetti e Programmazione Generica, Computer Programmin,No. 62
Daniele Licari
Nessun commento:
Posta un commento