CodeGym /Java Blog /Random-IT /Polimorfismo in Java
John Squirrels
Livello 41
San Francisco

Polimorfismo in Java

Pubblicato nel gruppo Random-IT
CIAO! Concludiamo oggi una serie di lezioni sui principi dell'OOP. In questa lezione parleremo del polimorfismo Java. Il polimorfismo è la capacità di lavorare con diversi tipi come se fossero dello stesso tipo. Inoltre, il comportamento degli oggetti sarà diverso a seconda della loro tipologia. Diamo un'occhiata più da vicino a questa affermazione. Partiamo dalla prima parte: 'la capacità di lavorare con più tipi come se fossero lo stesso tipo'. Come possono tipi diversi essere uguali? Suona un po' strano :/ Come usare il polimorfismo - 1In effetti, è tutto molto semplice. Ad esempio, questa situazione si verifica durante l'uso ordinario dell'eredità. Vediamo come funziona. Supponiamo di avere una semplice classe genitore Cat con un singolo metodo run() :

public class Cat {

   public void run() {
       System.out.println("Run!");
   }
}
Ora creeremo tre classi che ereditano Cat : Lion , Tiger e Cheetah .

public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
Quindi abbiamo 3 classi. Modelliamo la situazione in cui possiamo lavorare con loro come se fossero la stessa classe. Immagina che uno dei nostri gatti sia malato e abbia bisogno dell'aiuto del dottor Dolittle. Proviamo a creare una classe Dolittle in grado di curare leoni, tigri e ghepardi.

public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
Sembra che il problema sia risolto: la classe è scritta e pronta per partire. Ma cosa faremo se vogliamo estendere il nostro programma? Al momento ne abbiamo solo 3 tipi: leoni, tigri e ghepardi. Ma ci sono più di 40 tipi di gatti nel mondo. Immagina cosa succederebbe se aggiungessimo classi separate per manul, giaguari, Maine Coon, gatti domestici e tutto il resto. Come usare il polimorfismo - 2Il programma stesso, ovviamente, funzionerà, ma dobbiamo aggiungere costantemente nuovi metodi alla classe Dolittle per curare ogni tipo di gatto. Di conseguenza, raggiungerà dimensioni senza precedenti. È qui che entra in gioco il polimorfismo - "la capacità di lavorare con diversi tipi come se fossero dello stesso tipo". Non abbiamo bisogno di creare innumerevoli metodi per fare la stessa cosa - guarire un gatto. Un metodo è sufficiente per tutti loro:

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
Il metodo healCat() può accettare oggetti Lion , Tiger e Cheetah — sono tutte istanze di Cat :

public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

       Lion simba = new Lion();
       Tiger shereKhan = new Tiger();
       Cheetah chester = new Cheetah();

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
Output della console: il paziente è sano! Il paziente è sano! Il paziente è sano! Quindi il nostro Dolittleclass funziona con tipi diversi come se fossero dello stesso tipo. Affrontiamo ora la seconda parte: "inoltre, il comportamento degli oggetti sarà diverso a seconda della loro tipologia". È tutto molto semplice. In natura, ogni gatto corre in modo diverso. Come minimo, corrono a velocità diverse. Tra i nostri tre felini, il ghepardo è il più veloce, mentre la tigre e il leone corrono più lentamente. In altre parole, il loro comportamento è diverso. Il polimorfismo fa molto di più che permetterci di usare diversi tipi come uno solo. Ci permette anche di ricordare le loro differenze, preservando il comportamento specifico di ciascuno di essi. L'esempio seguente lo illustra. Supponiamo che i nostri gatti, dopo essersi ripresi con successo, decidano di godersi una piccola corsa. Aggiungeremo questo alla nostra classe Dolittle :

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
Proviamo a eseguire lo stesso codice per trattare tre animali:

public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

   Lion simba = new Lion();
   Tiger shereKhan = new Tiger();
   Cheetah chester = new Cheetah();

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
Ed ecco come appaiono i risultati: il paziente è sano! Il leone corre a 80 km/h. Il paziente è sano! La tigre corre a 60 km/h. Il paziente è sano! Il ghepardo corre fino a 120 km/h Qui vediamo chiaramente che il comportamento specifico degli oggetti è preservato, anche se abbiamo passato tutti e tre gli animali al metodo dopo averli "generalizzati" a Cat . A causa del polimorfismo, Java ricorda bene che questi non sono semplicemente tre gatti. Sono un leone, una tigre e un ghepardo, ognuno dei quali corre in modo diverso. Questo illustra il principale vantaggio del polimorfismo: la flessibilità. Quando abbiamo bisogno di implementare alcune funzionalità condivise da molti tipi, leoni, tigri e ghepardi diventano semplicemente "gatti". Tutti gli animali sono diversi, ma in alcune situazioni un gatto è un gatto, indipendentemente dalla sua specie :) Ecco alcuni video di conferma per te.
Quando questa "generalizzazione" è indesiderata e abbiamo invece bisogno che ogni specie si comporti in modo diverso, ogni tipo fa le sue cose. Grazie al polimorfismo, puoi creare un'unica interfaccia (insieme di metodi) per un'ampia gamma di classi. Questo rende i programmi meno complicati. Anche se espandessimo il programma per supportare 40 tipi di gatti, avremmo comunque l'interfaccia più semplice: un singolo metodo run() per tutti i 40 gatti.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION