Con il meccanismo dell'ereditarietà, i metodi si trovano spesso, nelle
classi di livello superiare a meno che una classe non sia stata specializzata
con metodi locali.
Può nascere un problema complesso se il metodo locale ha lo stesso
nome di un metodo che è localizzato un una delle superclassi. Allo
scopo di gestire una tale situazione, che può altrimenti generare del
"caos" durante l'elaborazione, si introduce il meccanismo del binding
che permette di collegare il nome del metodo invocato alla sua implementazione
dovunque e comunque essa si trovi. Vi sono due tipi di binding: binding
statico e binding dinamico.
Binding statico
Il compilatore crea una mappa di associazioni metodo-implementazione, prima
della compilazione del codice, una volta per tutte.
Binding dinamico
In questo caso la mappa di associazioni metodo-implementazione viene creata
in tempo reale durante l'elaborazione del sistema, all'invocazione del metodo.
Vantaggio: supporta il principio dell'evoluzione senza ricompilare
il codice.
Svantaggio: si spende del tempo per la ricerca del metodo.
Il "binding" dinamico (o late binding) consiste nel determinare a tempo d'esecuzione, anzichè a tempo di compilazione, la parte di codice da associare alla invocazione di una operazione su un dato oggetto.
Sia ad es. A un vettore di N oggetti della classe Figura_Geometrica, ovvero composto di oggetti delle sottoclassi Triangolo, Rettangolo, etc. Si consideri una funzione Disegna_Figure(), che contiene il seguente ciclo di istruzioni:
for i = 1 to N do
A[i].disegna()
L'esecuzione del ciclo richiede che sia possibile determinare dinamicamente, cioè a tempo d'esecuzione, l'implementazione della operazione disegna() da eseguire, in dipendenza dal tipo (dinamico) dell'oggetto A[i]. In tal modo il ciclo precedente non ha bisogno di essere modificato in conseguenza dell'aggiunta di una nuova sottoclasse di Figure_Geometriche, anche se tale sottoclasse non era stata neppure prevista all'atto della stesura della funzione Disegna_Figure(). (Si confronti con il caso dell'uso di una istruzione case nella programmazione tradizionale).
Il polimorfismo ed il binding dinamico si ritrovano nel linguaggio C++ nel concetto di funzioni virtuali.
Powered by Vincenzo Capuano