Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085

    Ereditarietà .. 'super'

    Ciao ..
    se non ho capito male 'super' in un costruttore serve per richiamare il costruttore della classe padre

    e questo è un esempio:

    codice:
    class Veicolo                   // extends Object                                                           
    {                                                                                                           
      private int NumeroPosti;                                                                                  
      public Veicolo(int NP)       // costruttore                                                               
        { NumeroPosti = NP; }                                                                                   
      public int getNumeroPosti()                                                                               
        { return NumeroPosti; }                                                                                 
    }                                                                                                           
                                                                                                                
    class VeicoloTerrestre extends Veicolo                                                                      
    {                                                                                                           
      private int NumeroRuote;                                                                                  
      public VeicoloTerrestre(int NP, int NR)      // costruttore                                               
      {                                                                                                         
        super(NP);                                 // chiama il costruttore del padre */                        
        NumeroRuote = NR;                                                                                       
      }                                                                                                         
      public int getNumeroRuote()                                                                               
      { return NumeroRuote; }                                                                                   
    }                                                                                                           
                                                                                                                
                                                                                                                
    class VeicoloMarino extends Veicolo                                                                         
    {                                                                                                           
      private long Stazza;                                                                                      
      public VeicoloMarino(int NP, long S)                                                                      
      {                                                                                                         
        super(NP);                                                                                              
        Stazza = S;                                                                                             
      }                                                                                                         
      public long getStazza()                                                                                   
      {  return Stazza;   }                                                                                     
    }                                                                                                           
                                                                                                                
    ---->  main                                                                                                 
                                                                                                                
    public class Esempio3                                                                                       
    {                                                                                                           
      public static void main(String args[])                                                                    
      {                                                                                                         
        VeicoloTerrestre MiaMacchina;                                                                           
        VeicoloMarino MiaNave;                                                                                  
        MiaMacchina = new VeicoloTerrestre(5, 4);                                                               
        System.out.println("La mia macchina ha " + MiaMacchina.getNumeroPosti() + " posti e "   +  MiaMacchina.getNumeroRuote() + " ruote");                                             
                                                                                                                
        MiaNave = new VeicoloMarino(10, 10);                                             
        System.out.println("La mia nave ha " + MiaNave.getNumeroPosti() + " posti e " +  
    	                      "una stazza di " + MiaNave.getStazza());                        
      }                                                                                                         
    }
    domandina ..

    'super' ha senso solo se la classe 'Veicolo' ha una sola proprietà !
    diversamente come ci si dovrebbe comportare ?

    ahh .. un'altra cosetta ..
    perchè 'NumeroPosti' (come anche 'NumeroRuote' e 'Stazza') è dichiarata 'private', visto che io ho il main in un altro file ?

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Ereditarietà .. 'super'

    Originariamente inviato da JANUS70
    se non ho capito male 'super' in un costruttore serve per richiamare il costruttore della classe padre
    super vuol dire "la super-classe". Poi se usi super(.....eventuali....) in un costruttore vuol dire invocare un costruttore nella super-classe, mentre super.metodo(.....eventuali....) vuol dire invocare un metodo nella super-classe.

    Originariamente inviato da JANUS70
    'super' ha senso solo se la classe 'Veicolo' ha una sola proprietà !
    diversamente come ci si dovrebbe comportare ?
    super(......) invoca un costruttore della super-classe. Che può avere 0, 1, 2, ..... N parametri. E glieli devi passare. Tutto qui.

    Originariamente inviato da JANUS70
    perchè 'NumeroPosti' (come anche 'NumeroRuote' e 'Stazza') è dichiarata 'private', visto che io ho il main in un altro file ?
    Per il buon principio di "incapsulazione".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085

    Re: Re: Ereditarietà .. 'super'

    Originariamente inviato da andbin
    super vuol dire "la super-classe". Poi se usi super(.....eventuali....) in un costruttore vuol dire invocare un costruttore nella super-classe, mentre super.metodo(.....eventuali....) vuol dire invocare un metodo nella super-classe.

    super(......) invoca un costruttore della super-classe. Che può avere 0, 1, 2, ..... N parametri. E glieli devi passare. Tutto qui.
    Non ho ben capito ..
    Nell'esempio specifico se io volessi aggiungere una proprietà alla classe 'padre' (NumeroMotori), e tale proprietà volessi riprenderla nella sottoclasse .. come dovrei fare ?

    codice:
    class Veicolo                         // extends Object                                                      
    {                                                                                                      
      private int NumeroPosti;     
      private int NumeroMotori;    
      public Veicolo(int NP, int NM)              
        {
          NumeroPosti = NP; 
          NumeroMotori = NM;
        }                                                                              
      public int getNumeroPosti()                                                                          
        { return NumeroPosti; }      
      public int getNumeroMotori()                                                                          
        { return NumeroMotori; }                                                                          
    }                                                                                                      
                                                                                                           
    class VeicoloTerrestre extends Veicolo                                                                 
    {                                                                                                      
      private int NumeroRuote;                                                                             
      public VeicoloTerrestre(int NP, int NM, int NR)      
      { 
        super(NP);                                 // chiama il costruttore del padre                    
        super(NM);                                 // chiama il costruttore del padre   
        NumeroRuote = NR;                                                                                  
      }                                                                                                    
      public int getNumeroRuote()                                                                          
      { return NumeroRuote; }                                                                              
    }                                                                                                      
                                                                                                           
                                                                                                           
    class VeicoloMarino extends Veicolo                                                                    
    {                                                                                                      
      private long Stazza;                                                                                 
      public VeicoloMarino(int NP, int NM, long S)                                                                 
      {                                                                                                    
        super(NP);   
        super(NM);                                                                                      
        Stazza = S;                                                                                        
      }                                                                                                    
      public long getStazza()                                                                              
      {  return Stazza;   }                                                                                
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    o rendi la proprietà protected (prassi comune) oppure rispetti l'incapsulamento e accedi alla proprietà con getter e setter

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Ereditarietà .. 'super'

    Originariamente inviato da JANUS70
    codice:
      public VeicoloTerrestre(int NP, int NM, int NR)      
      { 
        super(NP);                                 // chiama il costruttore del padre                    
        super(NM);                                 // chiama il costruttore del padre   
        NumeroRuote = NR;                                                                                  
      }
    No! Veicolo ha un costruttore che riceve 2 parametri .... no? E allora fai 1 invocazione super passando i 2 argomenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    Allora ..
    ho capito che per poter inserire nel costruttore della sottoclasse la proprietà della classe padre (per poterle inizializzare),
    posso usare 'super' in questo modo ..

    codice:
    super(NP, NM);

    oppure inserire nella classe padre dei metodi per valorizzare le proprietà dall'esterno ..


    codice:
              public void setNumeroPosti(int numeroPosti)          
              {                                                    
                  this.numeroPosti = numeroPosti;                  
              }                                      
              public void setNumeroMotori(int numeroMotori)     
              {                                                    
                 this.numeroMotori = numeroMotori;              
              }
    Quello che non ho capito è il discorso sulla proprietà 'protected' ..

    .. e poi mi piacerebbe vedere un esempio di uso di 'super' per indicare una variabile o un metodo della classe padre in caso di omonimia
    Grazie mille

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    protected è un livello di scope che dice

    1. i componenti sono PUBBLICI in due casi:
    a. per tutte le classi che si trovano nello stesso package in cui si trova la classe con l'elemento protected
    b. per tutte le altre classi inner che si trovano nella classe con l'elemento protected
    2. i componenti sono PRIVATE per il resto del mondo.

    Gli esempi vengono dalla pratica e dall'esperienza (e ora onestamente me ne vengono pochi). La scelta dello scope dipende anche da come pensi di implementare una classe, ma buona prassi è definire private i campi e public getter/setter.

    Per quanto riguarda l'uso di override ecc allora quando una classe estende un'altra classe in genere fa l'override di metodi oppure ne aggiunge.
    Quando hai classeB che estende classeA e in classeB riscrivi il metodoA della classeA richiamare il metodo

    istanzaB.metodoA();

    dice guarda che voglio che prendi la mia implementazione. Non puoi, in questo caso, prendere un'altra implementazione (a meno di cast ma non ti confondo ora).

    Dentro metodoA della classeB se vuoi mantenere il comportamento di A fai

    codice:
    public class classeB extends classeA{
        public void metodoA(){
                super.metodoA(); 
    //DO YOUR STUFF HERE
        }
    }
    la prima chiamata è a super, indicando in questo caso che vuoi venga cmq eseguito il codice della superclasse.
    Poi fai le tue cose.

    Spero di essere stata chiara

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    domandina ..
    e se il metodo della classe B lo chiamassi con altro nome .. come dovrei indicare il metodo della classe A ? .. metodoA()

    ah .. visto la disponibilità ..
    non è che mi spieghereste il seguente esempio (sinceramente non ne ho capito una ...)
    argomenti trattati: abstract - interface - implements

    codice:
            abstract class Veichle             
            {                                  
              private int NumeroPosti;         
              public int getNumeroPosti();     
            }                                  
            interface avviabile                
            {                                  
              void avvia();                    
              void ferma();                    
            }                                  
    
    
            class Veicolo extends Veichle implements avviabile                                  
            {                                                                                   
              public Veicolo(int NP)                 // costruttore                             
              { super(NP); }                                                                    
                                                                                                
              public int getNumeroPosti()                                                       
              { return NumeroPosti; }                                                           
                                                                                                
              public void avvia()                    // metodi derivati dall’interfaccia        
              { /* avvia il motore del veicolo */ }                                             
                                                                                                
              public void ferma()                                                               
              { /* ferma il motore del veicolo */ }                                             
            }                                                                                   
    
    
            class Timer implements avviabile                                     
            {                                                                    
              private int status;                                                
              public Timer();                                                    
              { status = 0; }                                                    
                                                                                 
              public int getStatus()                                             
              { return status; }                                                 
                                                                                 
              public void avvia()       // metodi derivati dall’interfaccia      
              { /* avvia il timer interno */ }                                   
                                                                                 
              public void ferma()                                                
              { /* ferma il timer interno */ }                                   
            }

  9. #9
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    Originariamente inviato da valia
    protected è un livello di scope che dice

    1. i componenti sono PUBBLICI in due casi:
    a. per tutte le classi che si trovano nello stesso package in cui si trova la classe con l'elemento protected
    b. per tutte le altre classi inner che si trovano nella classe con l'elemento protected
    2. i componenti sono PRIVATE per il resto del mondo.
    c. per tutte le classi che estendono la classe con elementi protected anche se in diversi package

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da oronze
    c. per tutte le classi che estendono la classe con elementi protected anche se in diversi package
    ehhe me lo scordo sempre grazie per la precisazione.


    Originariamente inviato da JANUS70
    domandina ..
    e se il metodo della classe B lo chiamassi con altro nome .. come dovrei indicare il metodo della classe A ? .. metodoA()
    che vuoi dire?

    Originariamente inviato da JANUS70
    ah .. visto la disponibilità ..
    non è che mi spieghereste il seguente esempio (sinceramente non ne ho capito una ...)
    argomenti trattati: abstract - interface - implements
    ok procurarti un buon testo e leggerlo dalla prima all'ultima pagina?? I testi hanno esempi ben commentati, un conto è la disponibilità per una cosa poco chiara, un conto è che ci hai preso come surrogati di professori!!!

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.