Il polimorfismo

Il termine polimorfismo indica un principio della programmazione ad oggetti per cui un oggetto può assumere sembianze o forme differenti, pur mantenendo una precisa identità, con delle specifiche caratteristiche e funzionalità.

In altri termini, il polimorfismo consente ad oggetti differenti, appartenenti a diverse sottoclassi di una superclasse comune, di essere trattati in modo omogeneo, assumendo le vesti della superclasse, pur mantenendo le proprie caratteristiche e funzionalità specifiche.

Esempio - Persona, lavoratore, studente
Ritornando all'esempio già visto della persona, del lavoratore e dello studente, sia lo studente che il lavoratore possono assumere le vesti/forma (classe) della persona ed, in tal modo, rispondere alla richiesta del nome o del cognome o compiere azioni quali camminare e dormire, ma non si può chiedere loro infomazioni sull'azienda o sulla scuola, oppure di lavorare o studiare, in quanto la classe persona non possiede tali caratteristiche e funzionalità.
Viceversa, quando lo studente o il lavoratore assumono la propria forma (classe), possono rispondere sia alla richiesta di informazioni proprie, quali la scuola o il lavoro, ma anche del nome o del cognome, in quanto essi sono comunque anche delle persone.
Per la stessa ragione possono eseguire sia funzionalità proprie, quali studiare o lavorare, che funzionalità della classe persona, quali camminare e dormire.

Quanto detto può essere sintetizzato nella figura seguente:


Polimorfismo

Il polimorfismo può riferirsi anche, in modo più specifico, ai metodi o funzionalità delle classi.
In tal caso si parla di:

  • overload, ossia quando un metodo è definito più volte, con lo stesso nome, nella stessa classe o in classi derivate, ma con informazioni (parametri) di input differenti
  • override, ossia quando un metodo presenta la stessa identica definizione, ossia stesso nome e parametri, in classi derivate, ma modo di operare (implementazione) differente

Entrando un po' più nel dettaglio:

  • l'overload si ha quando diversi metodi della stessa classe, o di classi derivate, presentano lo stesso nome, ma ordine o tipo o numero di parametri differente. Da quanto detto, si può dedurre che l'overload non implica necessariamente l'ereditarietà
  • l'override, invece, si ha quando diversi metodi, di classi derivate, presentano lo stesso nome, numero, tipo ed ordine dei parametri, ma implementazione differente. In questo caso si può dedurre che l'override implica necessariamente l'ereditarietà, in quanto non è possibile avere, nella stessa classe, due metodi esattamente identitici

Graficamente possiamo vedere i concetti di overload ed override come mostrato di seguito.

Overload e override

Ad ogni modo, tutti questi principi saranno trattati più dettagliatamente nel seguito.