Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    [JAVA] Upcasting e downcasting

    Non ho capito cosa sono.
    So che l'upcasting va da un sottotipo ad un sopratipo mentre il downcasting è l'opposto ma a cosa servono? Me li potete spiegare con qualche esempio?

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Se hai chiari i concetti di base della programmazione Object Oriented le cose risultano piuttosto facili. Partiamo da un concetto che userò come esempio:

    Ho una classe (astratta) Figura.
    Da tale classe posso derivare diverse sottoclassi: Triangolo, Rettangolo, Cerchio.
    Dalla classe Rettangolo posso derivare un'ulteriore classe: Quadrato.

    Prendiamo ora la classe Triangolo. Essendo derivata da Figura, la classe Triangolo è una Figura. Messa in questi termini dovrebbe risultare facile.

    Questo è il concetto fondamentale chiamato Ereditarietà. Una classe B che deriva da una classe A è, per ereditarietà, anche di tipo A.

    Che cos'è, quindi, un Up-Cast? Nel nostro esempio, è quell'operazione che "forza" un oggetto di tipo Triangolo ad essere visto come di tipo "Figura". Siccome la classe Triangolo deriva dalla classe Figura è facile capire che l'Up-Cast è "abbastanza inutile". Diventa necessario solo in particolari casi (vedremo dopo).

    Esempio:
    codice:
    Triangolo t = new Triangolo( ... );
    elaboraOggetto( (Figura) t );   // Up-Cast
    
    // Ma potevo tranquillamente scrivere anche così:
    elaboraOggetto( t );   // l'up-cast è sempre automatico (quando non ambiguo)
    Un Down-Cast è l'esatto opposto: se hai un oggetto di tipo Figura (perchè sei all'interno di un metodo che accetta oggetti di tale tipo) non sai a priori di quale figura si tratti (potrebbe essere un Triangolo, un Rettangolo, un Quadrato o un Cerchio). Si possono effettuare dei test per verificare esattamente di quale classe sia l'oggetto. Una volta capito di che tipo è, potresti aver bisogno di usarne i metodi specifici... per questo ti serve un Down-Cast.

    Esempio:

    codice:
    public void elaboraFigura(Figura f) {
       // Ok... che figura ho?
       if (f instanceof Cerchio) {
          // E' un cerchio... ottengo il centro
          Cerchio c = (Cerchio) f;   // Down-Cast
          Point centro = c.getCentro();
       }
       ...
    }
    Torniamo all'Up-Cast... che succede se ho un metodo sottoposto ad override? Supponiamo che la classe Triangolo implementi una interfaccia (esempio, "Ruotabile"). Bene... se ho un metodo che si chiama "ruota()" che prende un oggetto Figura e un altro metodo "ruota()" che prende un oggetto Ruotabile... come faccio a decidere quale dei due voglio usare? Qui sono obbligato ad effettuare un Up-Cast per specificare esattamente quale implementazione usare:

    codice:
    public void ruota(Figura f) { ... }
    public void ruota(Ruotabile r) { ... }
    ...
    Triangolo t = new Triangolo( ... );
    ruota( (Figura) t );   // Up-Cast per usare il metodo ruota(Figura f)
    ruota( (Ruotabile) t );   // Up-Cast per usare il metodo ruota(Ruotabile r)
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Chiarissimo! Grazie mille

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    per il resto, puoi leggere il libro di Kim Bruce
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    11
    davvero, ottima spiegazione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.