Oppure

Loading
15/11/12 0:06
Rekoj
Hi,

rieccomi qui dopo le domande sul C :D.

Questa volta la domanda non è strettamente legata al linguaggio, però non sapevo dove postarla se non qui, poiché sto studiando, anche, il Java.

Sono arrivato capitolo del manuale dove spiega il polimorfismo per dati, però ahimè, non ci ho capito molto.
Nel manuale ci esempi del tipo: Punto ogg = new Punto3D(); - Punto è la super-classe e Punto3D è la sottoclasse.

Il manuale dice che ogg punterà ad un indirizzo che valida il suo intervallo di puntamento, quindi l'interfaccia pubblica dell'oggetto conterrà i membri di Punto (se non ricordo male). Ecco, questo spiega, quindi a cosa serve ? qual è l'utilità del polimorfismo per dati ? ci sono esempi concreti in giro sul web ? e poi, esattamente cosa succede quando dichiaro un oggetto del genere ?

Grazie mille a tutti :love:

aaa
16/11/12 9:35
Il Totem
Ammetti di avere tre classi, Triangle, Quad e Circle, che rappresentano varie figure geometriche ed espongono un metodo draw() che ti consente di disegnarle da qualche parte. Volendo poter disegnare molti triangoli, quadrati o circonferenze, ti converrà avere una lista di oggetti di quel tipo. Ad esempio:
List<Triangle> triangles;
List<Quad> quads;
List<Circle> circles;

// ...

void drawAll() {
   for (Triangle t : triangles)
      t.draw()

   for (Quad q : quads)
       q.draw()

   for (Circle c : circles)
       c.draw()
}

Il tuo programma può funzionare anche in questo modo, ma supponi di voler un giorno aggiungere la possibilità di disegnare altre figure, ad esempio poligoni regolari (classe Poly). Dovresti a quel punto aggiungere un'altra lista, aggiungere del codice che la gestisca e modificare il codice di disegno: e questo per ogni nuova cosa che vuoi aggiungere. E' decisamente poco pratico.

Invece, notando che tutte le figure hanno qualcosa in comune, ossia sono figure geometriche piane e disegnabili, puoi introdurre una superclasse (eventualmente astratta) comune a tutte queste:
public abstract class Figure {
   public abstract void draw();
}

// ...
public class Triangle : Figure {
   // ...
}

public class Quad : Figure {
   // ...
}

A quel punto, sapendo che tutti gli oggetti che ti interessano sono sottoclassi di Figure, farai una sola lista di questo tipo:
List<Figure> figures;

void drawAll() {
   for(Figure f : figures)
      f.draw()
}

Ora ti basterà che le nuove classi derivino da Figure per poter essere disegnate, senza cambiare il codice. Il polimorfismo è uno dei metodi principali con cui viene soddisfatto l'Open-Closed principle.
aaa