Interfacce java

di il
3 risposte

Interfacce java

Leggendo qualcosina sulle interfacce ho trovato questo esempio e avrei un dubbio.

"Gli oggetti istanziati con le classi rettangolo, triangolo e cerchio sono simili tra loro perché ogni classe implementa l'interfaccia FiguraGeometrica.
Sfruttando questa proprietà, possiamo dichiare un riferimento di tipo FiguraGeometrica ed usarlo per richiamare il metodo stampaInformazioni() di ogni oggetto istanziato."


public classInformazioniFigureGeometriche{
public static void main(String[] args) {
FiguraGeometrica figuraGeometrica;
figuraGeometrica=new Rettangolo(5,10);
System.out.println(figuraGeometrica.stampaInformazioni());
figuraGeometrica=new Triangolo(13,14,15);
System.out.println(figuraGeometrica.stampaInformazioni());
figuraGeometrica=new Cerchio(5);
System.out.println(figuraGeometrica.stampaInformazioni());
}

Il punto è: mi è chiaro tutto quello che fa questo blocco di codice, l'interfaccia FiguraGeometrica, il riferimento figuraGeometrica e le varie classi (Rettangolo, Triangolo e Cerchio) che implementano l'interfaccia. Non mi è chiara invece l'utilità di questa cosa.
Perché mai dovrei dichiarare e soprattutto usare il riferimento figuraGeometrica per richiamare il metodo stampaInformazioni()?
Tale metodo è astratto nell'interfaccia e implementato nella maniera opportuna nelle varie classi.
Sinceramente penso che sia funzionante anche scrivere:
Rettangolo r = new Rettangolo (5,10);
r.stampaInformazioni()
Anzi, lo trovo anche più leggibile e di facile interpretazione.

Personalmente sono giunto alla sola conclusione che questo esempio è stato riportato solo per far capire che non è possibile istanziare un oggetto di un'interfaccia, ma è possibile invece dichiarare un riferimento all'interfaccia e usare quel riferimento per istanziare oggetti mediante il costruttore di classi che implementano quell'interfaccia.

Sto sbagliando a interpretare questi appunti o c'è qualcosa da notare che non riesco a comprendere?

3 Risposte

  • Re: Interfacce java

    Carmine2898 ha scritto:


    Sinceramente penso che sia funzionante anche scrivere:
    Rettangolo r = new Rettangolo (5,10);
    r.stampaInformazioni()
    Certo che è funzionante questo. Ma l'aspetto fondamentale del tipo "FiguraGeometrica" è rappresentato dal fatto che questo è un super-tipo! Cioè ti permette di "accomunare" più tipi differenti, permettendo di "vederli" in modo più astratto, generalizzato e uniforme, ma consentendo comunque di effettuare le operazioni sensate per quel livello di astrazione.

    Se tu volessi avere un array/collezione di figure geometriche eterogenee? Se tu volessi avere un metodo che deve poter ricevere una qualunque delle possibili figure concrete ma senza sapere realmente quale è, come faresti?

    Ti serve un SUPER-TIPO. Altrimenti quale altro super-tipo potresti usare?? Object? Sì, questo è il super-tipo assoluto di tutti gli oggetti. Ma NON ha e non potrebbe mai avere un stampaInformazioni() o un calcolaArea() o calcolaPerimetro().

    Ti è chiaro questo aspetto? Realizzare gerarchie di questo tipo non solo NON è sbagliato ma anzi, è fondamentale per sfruttare la programmazione ad oggetti.
  • Re: Interfacce java

    Carmine2898 ha scritto:


    ... Non mi è chiara invece l'utilità di questa cosa. ....
    Mettiamola in un'altro modo.
    E' abbastanza ovvio che lavorare con una singola figura geometrica non e' molto utile: qualunque disegno tu voglia realizzare richiede molte figure geometriche.

    Quindi, da qualche parte, avrai la necessita' di usare una collezione di figure geometriche.

    Ovviamente tale collezione NON POTRA ESSERE una collezione di rettangoli, perche' non tutte le figure geometriche saranno rettangoli. Vabbe', ci puo' essere il caso super semplice in cui il tuo disegno conterra' solo rettangoli, ma puoi tranquillamente immaginare disegni che contengono ANCHE ALTRE figure geometriche.

    Non potra' essere una collezione di triangoli oppure una collezione di cerchi, per lo stesso motivo.

    Potresti pensare di gestire collezioni specifiche per ogni tipo di figura geometrica, ma poiche' su queste collezioni dovrai fare esattamente le stesse cose, se hai TRE tipi di figure geometriche, dovrai scrivere lo stesso codice TRE volte.

    Se aggiungi nuove figure geometriche (pentagono, esagono, la stella, la freccia, ...) dovrai scrivere N volte lo stesso codice.

    Ovviamente questo risulterebbe DECISAMENTE scomodo: devi fare n-mila volte copia/incolla, e se correggi l'implementazione per una figura geometriche, poi ti devi ricordare di fare la stessa cosa per tutte le altre N figure geometriche, con rischio di dimenticarti pezzi per strada.

    Per ovviare a questo problema, ci sono DUE soluzioni possibili:

    1) usare una classe base (molto probabilmente astratta) da cui TUTTE le TUE figure geometriche derivano, ed in cui implementare le funzionalita' COMUNI a tutte le figure

    Ma usare una classe base ha un piccolo inconveniente: NON E' DETTO che tu voglia avere TUTTE le tue figure geometriche derivate da questa classe.

    Immagina, ad esempio, di avere un oggettone che descrive una stella (oggetto astronomico): per poterla disegnare ti serve avere una figura geometrica. Potresti, ad esempio, implementare un metodo "getFiguraGeometrica()" che ti ritorna la corrispondente figura.

    2) un'altra soluzione e' quella di usare un'interfaccia: se una classe implementa l'interfaccia, allora quella classe DEVE implementare i metodi definiti dall'interfaccia, MA NON C'E' nessun obbligo a derivare da una specifica classe base.

    Il tuo oggetto stella, quindi, essendo un oggetto astronomico, non deriva, ovviamente, dalla classe base delle figure geometriche, ma per poterlo utilizzare come figura geometrica, e' sufficiente che implementi i metodi dell'interfaccia.


    Come ha detto @andbin, per poter fare della programmazione ad oggetti, FONDAMENTALE e' capire che cosa e' una classe, un'interfaccia, l'ereditarieta', l'overloading ecc. Sono STRUMENTI FONDAMENTALI.

    E' come voler realizzare sculture senza saper usare martello e scalpello.
  • Re: Interfacce java

    Siete stati chiarissimi
    Grazie mille
Devi accedere o registrarti per scrivere nel forum
3 risposte