Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: JAVA: Override metodi

  1. #1

    JAVA: Override metodi

    Ciao a tutti,
    ho una questione che non mi torna un granché davvero strana:

    ho 4 classi:

    class A {}
    class B extends A {}

    class X
    {
    private A a;
    private A getA()
    private void setA(A value)
    }

    class Y extends X
    {
    private B b;
    private B getA()
    private void setA(B value)
    }

    su netbeans 3.6 che gira sulla JDK 1.4.2 mi da errore e non riesce a fare l'override del metodo getA().

    mentre invece su eclipse 3.1M2 che gira sulla JDK 1.5.0 funziona a meraviglia.

    E' normale??

    altra cosa:
    il metodo setA non va in overidden perché prende un nuovo tipo parametro, non si può fare l'override anche di questo?

    :master:

    credevo di conoscerla sta roba, invece ora mi rendo conto che ho una gran confusione in testa!!!!

    Ciao e grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    All'interno di una classe, puoi fare l'override solo dei metodi visibili; pertanto, avendo dichiarato tutti i metodi della classe base come private, nelle classi discendenti essi non sono visibili e tantomento possono essere ridefiniti.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

    scusa ma sono un pò lesso

    i metodi getA() sono public.

    comunque stiamo facendo test in ufficio a questo proposito:

    ci siamo resi conto che compilando classi java con la jdk 1.4.2 non possiamo fare questa operazione, mentre invece usando la 1.5.0 il metodo me lo vede come overridden.

    le cose a questo punto sono 2:

    o la 1.5.0 ha cambiato il metodo di pensare a livello logico dell'overriding e dell'overloading, oppure c'è un bug nella j2se 1.5.0.

    Dato che questi due concetti sono due pilastri della programmazione ad oggetti, io opterei più per la seconda scelta.
    Ho cercato sul sito della sun questo bug, senza alcun riscontro.
    Quindi ho scritto alla sun e ho chiesto di verificare.

    Tre settimane almeno... intanto ho provato a compilare e a lanciare da riga di comando l'applicazione e si comporta allo stesso modo di eclipse...

    comunque se vuoi fare un test eccoti il codice:

    prima compilalo e lancialo in j2se 1.4.2 e poi in j2se 1.5.0

    vedrai da solo:

    package pippo;

    public class A
    {
    private String as;

    public A() {}:

    public String getAs() { return(as); }
    }

    public class X
    {
    private A a;

    public X() {}

    public A getA() { return(a); }
    }

    public class B extends A
    {
    private String bs;

    public B() {}

    public String getBs() { return(bs); }
    }

    public class Y extends X
    {
    private B b;

    public Y() {}

    public B getA() { return(b); }
    }


    per sicurezza ti mando anche la mia java -version della 1.5.0:

    java version "1.5.0"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
    Java HotSpot(TM) Client VM (build 1.5.0-b64, mixed mode, sharing)

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333

    Re: scusa ma sono un pò lesso

    Originariamente inviato da mnkt
    i metodi getA() sono public.
    Nel codice che hai inviato la prima volta, no.

    Originariamente inviato da mnkt
    o la 1.5.0 ha cambiato il metodo di pensare a livello logico dell'overriding e dell'overloading, oppure c'è un bug nella j2se 1.5.0.
    Io utilizzo Java 1.5.0 con Eclipse ma il tuo codice non viene compilato perchè contiene degli errori.

    Innanzitutto, non puoi fare overload di un metodo discriminando con il valore di ritorno, mentre non puoi fare l'override di un metodo modificandone i parametri (in tal caso, diventa overload).

    Se - dopo tante prove - sei riuscito a compilare il codice significa che hai apportato modifiche tali da renderlo differente dalle versioni che hai pubblicato nei tuoi messaggi.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5

    questa è la prova esatta e mi funziona...

    public class clienti
    {
    private String RagSoc;

    public clienti() {}

    public String getRagSoc()
    {
    return RagSoc;
    }

    public void setRagSoc(String ragSoc)
    {
    RagSoc = ragSoc;
    }
    }

    public class clienti_ext extends clienti
    {
    private String NoteAgg;

    public clienti_ext() {}

    public String getNoteAgg()
    {
    return NoteAgg;
    }

    public void setNoteAgg(String noteAgg)
    {
    NoteAgg = noteAgg;
    }
    }

    public class ddt
    {
    private clienti cli = null;

    public ddt() {};

    public ddt(clienti c)
    {
    setclienti(c);
    }

    public void setclienti(clienti value)
    {
    cli = value;
    }

    public clienti getclienti()
    {
    return cli;
    }

    public void annullacliente()
    {
    cli = null;
    }

    public void stampaRagSoc()
    {
    System.out.println(cli != null ? cli.getRagSoc() : "");
    }

    }

    public class ddt_ext extends ddt
    {
    private clienti_ext cli;

    public ddt_ext() {}

    public ddt_ext(clienti_ext cli)
    {
    setclienti(cli);
    }

    public void setclienti(clienti_ext value)
    {
    cli = value;
    }

    public clienti_ext getclienti()
    {
    return(cli);
    }


    }

    public class main_class
    {
    public main_class()
    {
    ddt_ext ddt = new ddt_ext(new clienti_ext());
    ddt.getclienti().setNoteAgg("Alfredo");
    System.out.println(ddt.getclienti().getNoteAgg());

    ddt ddt2 = new ddt(new clienti());
    ddt2.getclienti().setRagSoc("Marco");
    System.out.println(ddt2.getclienti().getRagSoc());
    }


    public static void main(String[] args)
    {
    new main_class();
    }
    }

    questa funziona sulla 1.5.0 e non sulla 1.4.2

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Ci sarà un errore di configurazione da qualche parte.

    Il codice che hai postato contiene un errore (è tale sia nella versione 1.4.2 che nella versione 1.5.0): nella classe ddt_ext hai inserito un metodo getclienti che dovrebbe ridefinire ed estendere il metodo omonimo nella classe base; tuttavia, la ridefinizione del metodo nella classe discendente utilizza un diverso tipo di dati per il valore di ritorno e questo non è ammesso, poichè ridefinire un metodo significa cambiarne (o estenderne) l'implementazione, ma senza toccare l'interfaccia della classe.

    Ignoro il motivo per cui il tuo ambiente compila una cosa del genere, ma io farei una revisione del codice perchè concettualmente e praticamente la gerarchia di classi che hai progettato contiene gli errori descritti.

    P.S.: ricordati che conviene sempre adottare le convenzioni di scrittura del codice usando una lettera maiuscola e il "camel case" per la denominazione delle classi (ad esempio, DdtExt) e iniziando invece con la minuscola (ma usando sempre il "camel case") con i nomi di variabili e metodi (ad esempio, getClienti()).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    lo so che ci sono questi errori.
    e ce lo da su due ambienti differenti!
    te hai provato a compilarlo sulla 1.5.0 e con la 1.5.0?
    Eclipse lo devi configurare per farlo compilare con la 1.5.0...
    sennò compila in 1.4.2 ed utilizza le lib della 1.5.0...

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Originariamente inviato da mnkt
    lo so che ci sono questi errori.
    e ce lo da su due ambienti differenti!
    Mi sembra normale. Sono errori da correggere...non capisco quale sia il problema.

    Originariamente inviato da mnkt
    te hai provato a compilarlo sulla 1.5.0 e con la 1.5.0?
    Eclipse lo devi configurare per farlo compilare con la 1.5.0...
    sennò compila in 1.4.2 ed utilizza le lib della 1.5.0...
    Ho solo la 1.5.0 installata, pertanto Eclipse non può far altro che compilare con quella versione; inoltre, l'indicazione della versione appare anche nel "nodo" dedicato al progetto aperto per la scrittura del codice.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9

    il problema è che non mi da errori!!!

    per capire se ho settato il mio eclipse come il tuo:

    se vado sulle proprietà del progetto inquisito, e vedo come ho configurato il workspace, nella voce java compiler, nella linguetta Compliance e ClassFiles, io ho settato la release 1.5.0.... ed uso eclipse 3.1M2.

    Per default lui setta la 1.4....

    non so come faccia.... se uno non ce l'ha poi la 1.4.2....

    comunque se a questo vuoi guardarci mi faresti un favorone...

    io sto intanto provando a ricompilare su un linux...

    ti faccio sapere.
    Ciao

  10. #10
    ricompilando su un altro win2000 stesso problema!!!!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.