Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [java]Chiamare metodo della superclasse

    In caso di overriding viene sempre eseguito il metodo della classe a cui appartiene l' oggetto.
    Io, sapendo che esiste già ma per puro esercizio, ho provato a fare una classe Lista che non contiene campi se non gli elementi successivi della lista.
    Poi una classe Array (che per essere precisi non è un array, ma una lista di interi, solo che non sapevo come chiamarla) che eredita dalla classe Lista e aggiunge i campi elem corrispondenti ai valori interi dei singoli elementi della lista.
    Così si è facilitati perchè la classe Lista contiene già metodi per aggiungere elementi, se ad esempio voglio aggiungere un elemento a un oggetto di tipo Array, mi basta chiamare il metodo aggiungi della superclasse Lista, e poi aggiungere anche il singolo elemento al nuovo elemento che ho aggiunto.
    Il problema è che non capisco, in caso di overriding, come sia possibile chiamare il metodo aggiungi della superclasse Lista.
    Allora qui ho il codice della classe Lista:
    codice:
    /** Realizzazione di una lista senza campi
     *  I campi andranno poi aggiunti in caso si erediti da questa classe
     */
    public class Lista
    {
        private Lista prox;
        public Lista()
        {
            prox=this;
        }
        public Lista primo()
        {
            return prox;
        }
        public Lista ultimo()
        {
            Lista ptr;
            ptr=prox;
            while(ptr!=this)
                ptr=ptr.prox;
            return ptr;
        }
        public boolean cancella(Lista elem) /** elem è l' elemento da cancellare */
        {
            boolean result=false;
            Lista ptr,prev;
            ptr=this.prox;
            prev=this;
            while(ptr!=this && result==false)
            {
                if(ptr==elem)
                    result=true;
                else
                {
                    prev=ptr;
                    ptr=ptr.prox;
                }
            }
            if(result==true)
            {
                prev.prox=ptr.prox;
            }
            return result;
        }
        public boolean aggiungi(Lista elem) /** elem è l' elemento dopo il quale va aggiunto il nuovo elemento */
        {
            boolean result=false;
            Lista ptr,temp;
            ptr=this.prox;
            while(ptr!=this && result==false)
            {
                if(ptr==elem)
                    result=true;
                else
                    ptr=ptr.prox;
            }
            if(result==true)
            {
                temp=ptr.prox;
                ptr.prox=new Lista();
                ptr=ptr.prox;
                ptr.prox=temp;
            }
            return result;
        }
    }
    Qui invece ho il codice (incompleto) della classe Array:
    codice:
    public class Array extends Lista
    {
        private int elem;
        public boolean aggiungi(Lista elem, int valore)
        {
            boolean result=false;
            /* Qui dovrei chiamare il metodo aggiungi della superclasse Lista */
        }
    }

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

    Re: [java]Chiamare metodo della superclasse

    Originariamente inviato da ramy89
    codice:
        public boolean aggiungi(Lista elem, int valore)
        {
            boolean result=false;
            /* Qui dovrei chiamare il metodo aggiungi della superclasse Lista */
        }
    Tecnicamente puoi invocarlo tranquillamente ... lo "erediti".
    aggiungi( .... );


    Tuttavia, ti avverto che dal punto di vista concettuale non quadra molto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: Re: [java]Chiamare metodo della superclasse

    Originariamente inviato da andbin
    Tecnicamente puoi invocarlo tranquillamente ... lo "erediti".
    aggiungi( .... );


    Tuttavia, ti avverto che dal punto di vista concettuale non quadra molto.
    Ma c'è un overriding : aggiungi è un metodo sia della classe Array che della classe Lista.
    Se l' oggetto è di tipo Array chiama soltanto il metodo della classe Array.


    Poi ho riscontrato un altro problema: se dichiaro un riferimento di tipo Array, non è in grado di accedere al campo prox del suo supertipo.
    Innanzitutto la classe Lista l' ho modificata così:
    codice:
    protected Lista prox;
    Così il campo prox può essere acceduto anche se ho un riferimento di tipo Array.
    Ma il problema è che se dichiaro:
    codice:
    Array ptr;
    ptr=prox;
    Mi da errore:
    "incompatible types - found Lista but expected Array"
    Ma non dovrebbero essere tipi compatibili? Cioè Array è di tipo Array, ma anche di tipo Lista, e anche di tipo Object.Per cui dovrebbe essere compatibile col tipo Lista

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Forse è una cosa troppo difficile per me adesso, perchè ho scoperto che si può fare con i generics (che se non sbaglio sono come i template in c++) - che non ho ancora studiato.
    Non c'è modo (per ora,per me) di avere un tipo generico next e un tipo generico prev.
    Se prev e next erano generici non c'era alcun problema.

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

    Re: Re: Re: [java]Chiamare metodo della superclasse

    Originariamente inviato da ramy89
    Ma c'è un overriding : aggiungi è un metodo sia della classe Array che della classe Lista.
    No, è un overload ... hanno parametri differenti!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Hai ragione.Quindi su quella riga di codice bastava chiamare aggiungi passandogli come paramentro un tipo Lista.
    Penso che questo thread rimarrà "congelato", tornerò quando saprò fare i generics.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: Re: Re: [java]Chiamare metodo della superclasse

    Originariamente inviato da ramy89
    Ma il problema è che se dichiaro:
    codice:
    Array ptr;
    ptr=prox;
    Mi da errore:
    "incompatible types - found Lista but expected Array"
    Ma non dovrebbero essere tipi compatibili? Cioè Array è di tipo Array, ma anche di tipo Lista, e anche di tipo Object.Per cui dovrebbe essere compatibile col tipo Lista
    Appunto, l'errore è molto esplicativo.
    Dovresti rivedere un po' di polimorfismo, in generale la superclasse puoi spacciarla per la sottoclasse, il viceversa come vedi no.


    Se Prima è una classe e Seconda estende prima hai
    codice:
    		Prima prima = new Prima();
    		prima.stampa();
    		prima = new Seconda();
    		prima.stampa();
    fin qui tutto bene, puoi assegnare un'istanza di Seconda a Prima.
    codice:
    		Seconda seconda = new Seconda(); 
    		seconda.stampa();
    		seconda = new Prima();
    questa è invalida: una istanza della sottoclasse non può essere una della superclasse.

    Ricapitolando: ad una istanza della superclasse posso assegnarne una della sottoclasse, il viceversa non è vero.
    RTFM Read That F*** Manual!!!

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Un' altra domanda,se io ho una classe A, B eredita da A e C eredita da B (A<-B<-C), se nel metodo costruttore di C dichiaro :
    codice:
    super();
    Sto chiamando il metodo della superclasse A o B ?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ramy89
    Un' altra domanda,se io ho una classe A, B eredita da A e C eredita da B (A<-B<-C), se nel metodo costruttore di C dichiaro :
    codice:
    super();
    Sto chiamando il metodo della superclasse A o B ?
    Di B. I costruttori non vengono "ereditati" e non esiste per loro il concetto di override. Quindi è solo il costruttore della superclasse diretta che si può invocare con super()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da andbin
    Di B. I costruttori non vengono "ereditati" e non esiste per loro il concetto di override. Quindi è solo il costruttore della superclasse diretta che si può invocare con super()
    Aggiungo solo che se nella superclasse hai un costruttore con N parametri, puoi invocare quel costruttore dalla sottoclasse semplicemente con
    codice:
    super (parametro1, parametro2....parametroN);
    RTFM Read That F*** Manual!!!

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.