Vantaggio polimorfismo

di il
7 risposte

Vantaggio polimorfismo

Io ho due classi:
public class Punto {
      privateint  x,y;
      public Punto(int x,int y) {
            this.x=x;
            this.y=y;
      }
      public void sposta(int x,int y) {
            this.x=x;
            this.y=y;
      }
     public String toString() {
            return "<"+this.x+","+this.y+">";
      }
}
public class Cerchio extends Punto {
      private int x,y,raggio;
      public Cerchio(int x,int y,int r) {
            super(x,y);
            this.raggio=r;
      }
     public double getArea() {
            return raggio*raggio*3.14;
     }
     public String toString() {
            return "Centro : <"+this.x+","+this.y+"> e raggio: "+this.raggio;
      }
}
se scrivo in un main:
Punto p=new Punto(1,1);
Cerchio c=new Cerchio(3,3,2);
e poi:
p=c;
System.out.println(p);
p è come se fosse un cerchio in cui però non posso calcolare l'area,perchè ha tipo statico Punto.
Quindi che senso ha fare una cosa del genere?

7 Risposte

  • Re: Vantaggio polimorfismo

    Beh in realtà si tratta di un aspetto fondamentale della programmazione ad oggetti ed è molto importante conoscerne i vantaggi. Il tuo caso probabilmente non è molto rilevante perché di fatto un Cerchio non è un punto.

    Per fare un esempio semplice ma rilevante considera le seguenti classi:
    
    public class Persona{
       private String nome, cognome;
       private int eta;
    
       public Persona(String n, String c, int e){
          nome = n;
          cognome = c;
          eta = e;
       }
    
       //Tutti i getters e setters 
       ....
    } 
    
    public class Studente extends Persona{
       private String matricola;
      
       public Studente(String n, String c, int e, String m){
          super(n,c,e);
          matricola = m;
       }
    
       //Getter e setter per matricola
       ...
    }
    
    public class Lavoratore extends Persona{
       private String stipendio;
     
       public Lavoratore(String n, String c, int e, String s){
          super(n,c,e);
          stipendio = s;
       }
    
       //Getter e setter per stipendio
       ...
    }
    
    In questo modo in ogni contesto in cui è richiesto un oggetto di tipo Persona si può utilizzare indifferentemente sia una Persona, sia uno Studente sia un Lavoratore e questo grazie al polimorfismo. Ovviamente dal momento che è richiesto un oggetto di tipo Persona non sarà possibile utilizzare i metodi specifici di Studente e neanche di Lavoratore, poiché appunto si tratta di una Persona e non è detto che essa debba avere per forza uno stipendio o un numero di matricola.

    L'esempio è molto banale ma spero possa aiutarti a comprendere il significato di questo meccanismo. Se hai dubbi chiedi pure perché come già detto il polimorfismo è fondamentale per la OOP.
  • Re: Vantaggio polimorfismo

    Ok, nell'esempio che tu hai fatto posso scrivere:
    Persona p=new Persona("Mario","Rossi","18");
    Studente s=new Studente("Mario","Rossi",18,"1234");
    
    p=s;
    così srivendo p assume anche tipo dinamico Studente.
    mettiamo il caso che nella classe Studente ci sia un getMatricola(),metodo che non è presente in Persona.

    così facendo però io non posso scrivere:
    p.getMatricola();
    perchè il metodo non è presente nella classe Persona che definisce il tipo statico di p
  • Re: Vantaggio polimorfismo

    Esatto, tu non puoi fare "p.getMatricola()" perché p è di tipo Studente e quindi non possiede quel metodo..che poi l'oggetto referenziato sia di un altro tipo è un altro discorso
  • Re: Vantaggio polimorfismo

    Quindi in questo caso è come se p è sia di tipo Persona che di tipo Studente,però alla fine e come se non fosse ne diciamo "ne carne ne pesce",correggimi se sbaglio?
  • Re: Vantaggio polimorfismo

    Non è proprio così: p è il puntatore ed è di tipo Persona. L'oggetto invece è uno Studente. Dato che però Studente è anche Persona (per via dell'ereditarietà).
    Utilizzare p per gestire un oggetto di tipo studente significa voler utilizzare tutte e sole le funzionalità che il tipo Persona prevede. È più difficile spiegarlo che farlo
  • Re: Vantaggio polimorfismo

    In effetti è vero
  • Re: Vantaggio polimorfismo

    Comunque sostanzialmente è il principio su cui si basano tante cose fra cui la gestione degli eventi tramite i listeners
Devi accedere o registrarti per scrivere nel forum
7 risposte