Il nome di Polimorfismo deriva dal greco e significa che può prendere più forme. Questa caratteristica è uno dei concetti essenziali della programmazione orientata oggetto. Quando l'eredità riguarda le classi (e la loro gerarchia), il polimorfismo è relativo ai metodi degli oggetti.
Distinguiamo generalmente tre tipi di polimorfismo:
Il polimorfismo ad hoc (anche sovraccarico o in inglese overloading);
Il polimorfismo parametrico (anche genericità o in inglese template);
Il polimorfismo di eredità (anche ridefinizione, specializzazione o in inglese overriding):
Ora andiamo a definire più precisamente questi concetti, ma è importante sottolineare che esiste molta confusione quando si tratta di differenziare tutti questi tipi di polimorfismo.
Il polimorfismo ad hoc permette di avere delle funzioni di nome identico, con delle funzionalità simili, in classi che non hanno nessun rapporto fra loro (se non ovviamente essere figlie della stessa classe oggetto). Ad esempio, la classe complessa, la classe immagine e la classe link possono avere ognuna una funzione "visualizza". Questo permetterà di non preoccuparsi del tipo di oggetto in questione quando si vuole visualizzarlo sullo schermo.
Il polimorfismo ad hoc definisce quindi degli operatori il cui uso sarà diverso secondo il tipo di parametri che gli sono passati. E' così possibile ad esempio sovraccaricare l'operatore + e fargli realizzare delle azioni diverse a seconda se si tratti di un'operazione tra due numeri interi (addizione) o tra due stringhe di caratteri (concatenazione).
Il polimorfismo parametrico, detto genericità, rappresenta la possibilità di definire più funzioni di nome identico ma con parametri diversi (in numero e/o tipo). Il polimorfismo parametrico rende quindi possibile la scelta automatica del metodo corretto da adottare secondo il tipo di dato definito.
Così, si possono ad esempio definire più metodi omonimi addition() che effettuano una somma di valori:
Il metodo int addition (int, int) darà come risultato la somma di due numeri interi;
Il metodo float addition (float, float) darà come risultato la somma di due flottanti;
Il metodo char addition(char, char) potrà definire la somma di due caratteri scelti dall'autore, ecc.
Viene chiamata firma il numero e il tipo (statico) di argomenti di una funzione. È quindi la firma di un metodo a determinarne il nome.
La possibilità di ridefinire un metodo in classi ereditiere di una classe di base viene detta specializzazione. E' quindi possibile denominare il metodo di un oggetto senza preoccuparsi del suo tipo intrinseco: si tratta del polimorfismo ereditario. Questo permette di estrarre dei dettagli delle classi specializzate da una famiglia di oggetto, nascondendole in un'interfaccia comune (che è la classe di base).
Immaginiamo una scacchiera con gli oggetti re, regina, fante, cavallo, torre e pedina, eredi ciascuno dell'oggetto pezzo. Il metodo movimento(i) potrà, grazie al polimorfismo ereditario, effettuare il movimento appropriato in funzione della classe dell'oggetto di riferimento al momento della richiesta. Questo permetterà soprattutto al programma di dire pezzo.movimento senza doversi preoccupare della classe del pezzo.
Foto: © Pixabay.