Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53

    [JAVA] problema ereditarietà

    sto realizzando un programmino per la gestione di una concessionaria di automobili.

    ho previsto una classe ModelloAuto
    due sottoclassi di Auto -> AutoNuova e AutoUsata
    una sottoclasse di AutoNuova -> AutoNuovaDisponibile

    il problema sorge nell'ultima di queste.
    in quanto è necessario un campo ID in AutoNuova ma che non deve esserci in AutoNuovaDisponibile.
    ho cercato un po' in giro ma non è possibile fare ciò che mi sarebbe utile cioè fare in modo che l'attributo non venga ereditato. inoltre lo shadowing devasterebbe molte cose.

    il problema sorge in quanto se tolgo l'ereditarietà tra AutoNuova e AutoNuovaDisponibile dovrei poi fare due classi quasi uguali per la gestione degli elenchi degli oggetti istanze di queste due classi! cosa brutta ovviamente!

    che fare?

    (se servono maggiori info basta chiedere..)

  2. #2
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53
    per capire meglio allego il design delle classe tagliuzzato da bluej...

    se rimanesse così avrei una classe ElencoAuto che potrei usare per 3 elenchi che lavorano allo stesso modo (auto nuove, auto usate, auto disponibili)
    mentre togliendo l'eredità mi troverei a dover fare una nuova classe per gestire una lista di auto disponibili, cosa che oltre a non voler fare non mi sembra corretta!

    spero sia + o - chiaro...
    Immagini allegate Immagini allegate

  3. #3
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53
    per ora sto provando così

    prima di tutto ho cambiato un po' il giro di nomi delle classi per renderli + comprendisibili

    quindi:
    ModelloAuto diventa Auto
    AutoNuova resta uguale
    AutoUsata resta uguale
    AutoNuovaDisponibile diventa ModelloAuto

    in oltre dichiaro Auto come classe astratta dato che mi serve solo per avere e utilizzare indistintamente le altre 3 in una classe ElencoAuto.

    come soluzione non è ancora il top, però non vedo altre vie per ora...

  4. #4
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53

    [JAVA + vari/eventuali] Polimorfismo o no?

    legato al problema posto nell'altro thread (qui)

    volevo usare il polimorfismo per fare degli elenchi (omogenei) di 3 classi che ho definito sottoclassi di un'altra classe astratta.
    le classi oltre ad avere i metodi della superclasse hanno anche attributi e metodi specifici (basti pensare ai soli get/set per i nuovi attributi).

    ora il problema si pone nella crezione di una classe Elenco che vada bene per gestire direttamente tutte e 3 le classi di cui sopra.

    per esempio:
    se devo cercare un particolare oggetto nell'elenco, avrò attributi diversi a seconda degli oggetti contenuti. riferendomi in particolare al mio problema dell'altro 3d. Non potrò per esempio filtrare l'elenco in base ad un anno di immatricolazione di una AutoUsata dato che se mi trovo AutoNuove il metodo getAnno() non sarà disponibile (oltretutto ovviamente mi da errore in compilazione, dato che il metodo non è definito nella classe "Auto" astratta)

    problema di design?

    l'unica soluzione è fare 3 classi per gestirmi i 3 diversi elenchi, magari ereditando da una classe elenco generica con i metodi comuni?

    edit: nel rileggere il post per le correzioni del caso mi è venuto in mente che potrei denire un metodo filtra da ridefinire in qualche modo a seconda della classe su cui lavoro...ma dove?

  5. #5
    Ehmm..scusa ma sei al corrente del fatto che gli attributi e i metodi di una classe dihiarati private NON sono ereditati dalle classi figlie?Non vedo dove stia il tup problema, lasci tutto com'è ed ID lo dichiari private.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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

    Moderazione

    Ho unito le discussioni relative a questo argomento e modificato opportunamente il titolo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53
    Originariamente inviato da unomichisiada
    Ehmm..scusa ma sei al corrente del fatto che gli attributi e i metodi di una classe dihiarati private NON sono ereditati dalle classi figlie?Non vedo dove stia il tup problema, lasci tutto com'è ed ID lo dichiari private.
    non è che non viene ereditato. è che rimane accessibile solo attraverso i metodi messi a disposizione dalla super classe ( getAttributo() )

    ho fatto una prova di postare:
    codice:
    AutoNuova auto = new AutoNuova("fiat", "punto", "benzina", 1800, 80, 4, 10000, 15000);
    GregorianCalendar data1 = new GregorianCalendar();
    GregorianCalendar data2 = new GregorianCalendar(2006, 01, 05);
    AutoNuovaDisponibile comprata = new AutoNuovaDisponibile(auto, data1, data2, 216498259);
    
    System.out.println(auto.getId());
    System.out.println(comprata.getId());
    sia auto che comprata ovviamente stampano un id.
    sarebbe inutile dichiarare getId private per non farlo ereditare dato che poi sarebbe un metodo che non posso usare e a quel punto sarebbe inutile l'attributo...

  8. #8
    Originariamente inviato da lepre
    non è che non viene ereditato. è che rimane accessibile solo attraverso i metodi messi a disposizione dalla super classe ( getAttributo() )

    ho fatto una prova di postare:
    codice:
    AutoNuova auto = new AutoNuova("fiat", "punto", "benzina", 1800, 80, 4, 10000, 15000);
    GregorianCalendar data1 = new GregorianCalendar();
    GregorianCalendar data2 = new GregorianCalendar(2006, 01, 05);
    AutoNuovaDisponibile comprata = new AutoNuovaDisponibile(auto, data1, data2, 216498259);
    
    System.out.println(auto.getId());
    System.out.println(comprata.getId());
    sia auto che comprata ovviamente stampano un id.
    sarebbe inutile dichiarare getId private per non farlo ereditare dato che poi sarebbe un metodo che non posso usare e a quel punto sarebbe inutile l'attributo...
    Aspetta allora c'è qualcosa che mi sfugge. Tu a chi vuoi che sia accessibile questo attributo id? Alle classi esterne e basta e non alle figlie o cosa?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Utente di HTML.it L'avatar di lepre
    Registrato dal
    Jun 2003
    Messaggi
    53
    Originariamente inviato da unomichisiada
    Aspetta allora c'è qualcosa che mi sfugge. Tu a chi vuoi che sia accessibile questo attributo id? Alle classi esterne e basta e non alle figlie o cosa?
    deve essere visibile il metodo getId() dall'esterno

    le classi figlie non devono avere ne id ne getId(), ma credo non si possa..

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Proprio per questioni legate all'ereditarietà non è possibile.
    Se io ho una classe B che deriva (eredita) da A, allora posso sempre dire che un oggetto di tipo B è anche un oggetto di tipo A. Detto questo, se l'oggetto in questione è anche di tipo A non può non avere un attributo (metodo o campo che sia) di tale classe.


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