Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Chiamate di metodo a cascata: come funzionano?

    Salve,

    Non ho ben capito l'uso delle chiamate di metodo a cascata abbinato al riferimento this.

    Anzitutto riassumo quello che dice il mio libro:

    [...]Un riferimento può essere seguito da un operatore punto (.) e da una chiamata a uno dei metodi del tipo di riferimento. E' possibile concatenare più metodi tramite l'operatore punto, prestando attenzione al valore restituito dal metodo. Questa tecnica è detta chiamate di metodo a cascata (o concatenate).[...]
    [...]Il riferimento this è implicitamente usato per referenziare sia le variabili d'istanza che i metodi di un oggetto.[...]

    La teoria mi è chiara, ma non riesco ad afferrare completamente questo esempio, che abbrevio:

    Codice PHP:
    class Time{
       ...
       public 
    Time setHour(int h){
          ...
          return 
    this;   // Ritorna un oggetto Time
       
    }
       public 
    Time setMinute(int m){
          ...
          return 
    this;   
       }
       public 
    Time setsecond(int s){
          ...
          return 
    this;   
       }
    }

    public class 
    TimeTest{
       
    Time t = new Time();
       
    t.setHour(18).setMinute(30).setSecond(22);
       ...

    Non riesco ad afferrare completamente l'ultima riga, la chiamata a cascata appunto.
    Ho capito che è possibile solo grazie al fatto che tutti e tre restituiscono un oggetto Time a cui t fa riferimento, ma sento che mi manca qualcosa. Mi spiego: io posso anche chiamare un ipotetico metodo
    Codice PHP:
    string output "output : " +t.setTime(20,20,20).toString(); 
    ma in questo caso abbino una String ad un oggetto Time.
    In altre parole : che direzione ed in che modo si fanno i controlli sui tipi di dato restituiti per mezzo dell'operatore punto (.)?

    spero di essere stato chiaro e chiedo venia per la prolissità,
    Matteo

  2. #2
    Ciao,
    il concetto è che puoi scrivere del codice molto contratto:

    Per esempio:
    Immagina una ipotetica classe Calciatore:
    questo può calciare la palla e verificare quanto lontana la ha mandata.

    Puoi scriverlo cosi:
    Calciatore c = new Calciatore("Ibra");
    Lancio l = c.getLancio();
    int distanza = l.getDistanza();

    Oppure puoi scriverlo cosi:
    int distanza = new Calciatore("Ibra").getLancio().getDistanza();

    Questo perchè il codice viene interpretato da dx a sx ed ogni istruzione restituisce una
    istanza di cui sono conosciuti metodi e proprietà.

    Spero di averti aiutato nel comprendere la questione.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  3. #3
    Grazie anzitutto per la risposta.

    In pratica, detto in maniera impropria, si tratta di usare direttamente i valori restituiti dai metodi, senza associarli prima a delle variabili al fine di sintetizzare il codice?

    Ho capito il concetto, ma ci sta un passo del tuo codice che non comprendo.

    Codice PHP:
    Lancio l c.getLancio(); 
    getLancio() non dovrebbe essere un metodo della classe Lancio? Vedo che lo referenzi con c che si riferisce a Calciatore.

  4. #4
    No,
    è un metodo della classe calciatore che restituisce una istanza della classe Lancio.
    Questo oggetto,
    potrà contenere altre informazioni quali il tempo che la palla è rimasta in aria,
    che altezza ha raggiunto ecc....

    Ricorda che l'incapsulamento è una caratteristica fondamentale della programmazione ad oggetti.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  5. #5
    Ok

    Quindi seguendo il tuo esempio:

    Codice PHP:
    int distanza = new Calciatore("Ibra").getLancio().getDistanza(); 
    E' possibile perchè:

    1) new Calciatore("Ibra") --> Mi restituisce un riferimento anonimo alla classe Calciatore, grazie al quale posso chiamare i metodi della classe Calciatore, ovvero getLancio();

    2) new Calciatore("Ibra").getLancio() --> Mi restuisce un riferimento anonimo alla classe Lancio grazie al quale posso chiamare i metodi della classe Lancio, ovvero getDistanza();

    3) new Calciatore("Ibra").getLancio().getDistanza(); --> Mi restituisce un intero che posso assegnare alla variabile int distanza

    In altre parole anzicchè usare variabili in cui referenziare gli oggetti si ricorre a dei riferimenti anonimi, combinandone i valori di ritorno

    Grazie mille

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.