Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415

    Chiarimento su estensione

    Ciao a tutti,
    vi presento questa situazione:

    1) ho due bean: Persona e Lavoratore con le loro variabili e i loro metodi
    2) la classe Lavoratore estende la classe Persona
    3) un metodo di un terzo oggetto mi restituisce un oggetto Persona con le variabili popolate

    Io avrei bisogno di utilizzare questo oggetto restituito nel punto 3 come Lavoratore, cioè vorrei mantenere i valori delle variabili come popolate nel punto 3 e in più vorrei avere a disposizione le variabili e i metodi propri dell'oggetto Lavoratore.

    Sapete darmi una mano?

    Grazie,
    Matteo

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Si usa il cast:

    codice:
    Lavoratore l = (Lavoratore) terzoOggetto.getPersona();
    Ovviamente devi essere certo che il metodo restituisca una istanza della classe Lavoratore e non una della classe Persona e basta.


    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
    Jun 2005
    Messaggi
    415
    In realtà mi restituisce un'istanza della classe Persona: visto che Lavoratore ha tutte le caratteristiche di Persona, non c'è un modo per prendere l'oggetto restituito (che è di tipo Persona) e farlo diventare Lavoratore?

    Non ho capito una cosa: se il metodo mi restituisce un'istanza della classe Lavoratore, perché dovrei fare il cast?

    Forse ho le idee un po' confuse...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Andiamo con ordine.

    Originariamente inviato da Teo80
    In realtà mi restituisce un'istanza della classe Persona: visto che Lavoratore ha tutte le caratteristiche di Persona, non c'è un modo per prendere l'oggetto restituito (che è di tipo Persona) e farlo diventare Lavoratore?
    Se l'oggetto restituisce una istanza della classe Persona non puoi farci niente. Persona non conosce (e mai potrebbe) le sue sottoclassi, che sono potenzialmente infinite. Oltretutto sono due oggetti diversi: Lavoratore estende Persona, quindi Lavoratore è una Persona... ma Persona non è necessariamente un Lavoratore (potrebbe essere uno Studente o un NullaFacente, per quel che ne può sapere Persona)...

    Non ho capito una cosa: se il metodo mi restituisce un'istanza della classe Lavoratore, perché dovrei fare il cast?

    Forse ho le idee un po' confuse...
    Perchè se l'oggetto vuole essere il più generico possibile, potrebbe lavorare con diversi tipi di oggetto (Lavoratore, Studente e NullaFacente) e restituire l'istanza sottoforma di Persona, per non avere tre metodi diversi che fanno la stessa cosa.

    In quel caso, se tu sapessi a priori che l'oggetto restituito è di tipo Lavoratore, useresti un cast (come dimostrato prima nel mio esempio) per meglio specificare l'oggetto e averne tutti i metodi a disposizione.

    Un esempio per chiarire. Un contenitore grafico, come un JPanel, può contenere al suo interno di versi tipi di oggetto: JLabel, JButton, JList, JScrollPane, ecc... JPanel, estendendo Container, ha il metodo "getComponent(int i)" che restituisce l'i-esimo componente al suo interno... è ovvio che quel metodo restituisce un oggetto specifico (JLabel, JButton, ecc) a seconda di ciò che vi è contenuto in quella posizione... ma non potendo sapere a priori che tipo di oggetto sia deve restituire un generico Component. Tu che stai programmando, però, puoi avere inserito, ad esempio, solo delle JLabel... ecco che getComponent(int i) ti restituisce un Component, ma tu sai con precisione che è una JLabel e con un cast hai a disposizione tutti i suoi metodi.


    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415
    Cioè se ho capito bene: io istanzio tre tipi di oggetti diversi che estendono tutti Persona e poi a seconda della logica dell’applicazione ne ritorno uno facendo il casting a Persona? Cioè una cosa del tipo:

    Codice PHP:
    Lavoratore lavoratore = new Lavoratore()
    Studente studente = new Studente()




    If(.){
        return (
    Persona)lavoratore;
    } else {
        return (
    Persona)studente;


  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Teo80
    ne ritorno uno facendo il casting a Persona?
    Piccola nota: il cast esplicito non è affatto necessario! Con i tipi reference un "up-cast" non fallisce mai e non dà mai problemi. Ed è ... implicito!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da andbin
    Piccola nota: il cast esplicito non è affatto necessario! Con i tipi reference un "up-cast" non fallisce mai e non dà mai problemi. Ed è ... implicito!
    Detto in Java, con il tuo codice:

    codice:
    public Persona getPersona() {
    
       Lavoratore lavoratore = new Lavoratore(...);
       Studente studente = new Studente(...);
       ...
       if ( ... ) {
          return lavoratore;
       } else {
          return studente;
       }
    }
    O, per scriverla meglio ed in modo perfettamente equivalente:

    codice:
    public Persona getPersona() {
    
       Persona p = null;
       if ( ... ) {
          p = new Lavoratore(...);
       } else {
          p = new Studente(...);
       }
       ...
       return p;
    }
    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

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.