Il Polimorfismo: descrizione ed esempi
DOMANDA:
Che cos'è il polimorfismo in Java?
RISPOSTA:
Uno degli elementi fondamentali della programmazione ad oggetti (e quindi anche di Java) è proprio il polimorfismo. Con questo termine, scomponendo ad intuito, possiamo dedurne il significato: poli - morfismo -> multi-forme (non formalizziamoci sull'etimologia del termine).
Proprio come suggerito dall'intuito, il polimorfismo altro non è che la capacità di un oggetto di poter assumere diverse forme.
Il concetto è spesso ostico ai neofiti della programmazione ad oggetti, ma in realtà, con un esempio pratico si può cominciare a capire la potenza di questo sistema.
ESEMPIO
Un leone, una mucca e un cavallo avranno tutti e tre la capacità di emettere un proprio verso.
Vediamolo nel dettaglio:
package polimorfismo; public class Leone { public void emettiVerso(){ System.out.println("RUGGITO"); } }
package polimorfismo; public class Mucca { public void emettiVerso(){ System.out.println("MUGGITO"); } }
package polimorfismo; public class Cavallo { public void emettiVerso(){ System.out.println("NITRITO"); } }
In questi esempi il modo per far emettere un verso ai diversi "animali" è questo:
package polimorfismo; public class Fattoria { public static void main(String args[]){ Leone leo = new Leone(); leo.emettiVerso(); Mucca muu = new Mucca(); muu.emettiVerso(); Cavallo cav = new Cavallo(); cav.emettiVerso(); } }L'output sarà banalmente:
RUGGITO
MUGGITO
NITRITO
MUGGITO
NITRITO
Fin qui niente di particolare. Ma vediamo come sfruttare il polimorfismo.
Creiamo un'interfaccia Animale che comprenda tutti i diversi animali della nostra Fattoria.
package polimorfismo; public interface Animale { public void emettiVerso(); }
Con questa interfaccia ci siamo assicurati che tutti gli Animale sappiano emettere un verso (quindi abbiano il metodo emettiVerso()).
Facciamo in modo che il Leone, la Mucca e il Cavallo siano degli Animale implementandone l'interfaccia:
package polimorfismo; public class Leone implements Animale { public void emettiVerso(){ System.out.println("RUGGITO"); } }
package polimorfismo; public class Mucca implements Animale { public void emettiVerso(){ System.out.println("MUGGITO"); } }
package polimorfismo; public class Cavallo implements Animale { public void emettiVerso(){ System.out.println("NITRITO"); } }
Adesso modifichiamo leggermente la classe main Fattoria:
package polimorfismo; public class Fattoria { public static void main(String args[]){ Animale leo = new Leone(); leo.emettiVerso(); Animale muu = new Mucca(); muu.emettiVerso(); Animale cav = new Cavallo(); cav.emettiVerso(); } }
L'output sarà ugualmente:
RUGGITO
MUGGITO
NITRITO
MUGGITO
NITRITO
Nella pratica i tre oggetti di diverso tipo sono tutti e tre degli Animale generici, ma conservano le proprie specifiche caratteristiche.
Il polimorfismo risulta utile in moltissimi casi.
Un esempio evidente è in un array:
package polimorfismo; public class FattoriaTest { public static void main(String args[]){ Animale[] arrayAnimali = new Animale[5]; arrayAnimali[0] = new Mucca(); arrayAnimali[1] = new Mucca(); arrayAnimali[2] = new Cavallo(); arrayAnimali[3] = new Mucca(); arrayAnimali[4] = new Leone(); for(Animale anim: arrayAnimali) anim.emettiVerso(); } }
L'output sarà:
MUGGITO
MUGGITO
NITRITO
MUGGITO
RUGGITO
MUGGITO
NITRITO
MUGGITO
RUGGITO
Come si può notare non abbiamo dovuto effettuare cast, instance of o altri controlli. L'oggetto Animale sa assumere automaticamente più forme e quindi diversi comportamenti. Questa capacità è detta polimorfismo ed è comune a diversi linguaggi ad oggetti.
NOTA: negli esempi abbiamo implementato il polimorfismo attraverso l'utilizzo di interfacce. Avremmo potuto farlo allo stesso modo creando la super classe (e non l'interfaccia) Animale e poi estendendola con i tre diversi oggetti Leone, Mucca e Cavallo.
Il polimorfismo è possibile grazie al binding dinamico di Java. Infatti il compilatore non decide quale metodo chiamare nella fase di compilazione, ma si limita a creare delle tabelle che consentono al programma di scegliere il metodo giusto a runtime in base alla classe dell’oggetto.
Commenti
Posta un commento