Superclasse/sottoclasse

di il
70 risposte

Superclasse/sottoclasse

Buonasera
apro un nuovo thread giusto per chiedere una cosa veloce
(sono sicuro che qua un paio di voi mi staccheranno di dosso gli occhi a morsi, comunque...
allora io ho la mia superclasse (veicoli, per chi ormai mi "segue" ) e 2 sottoclassi, una moto e una automobili
ora. ho 2 attributi, in veicoli, che sono marca e modello.
questi 2 valori qua io li vado a leggere, tramite 2 metodi, da 4 file differenti, uno per auto, uno per moto, per entrambi.
ora, posso in qualche modo, nel costruttore di veicolo, fare in modo che a seconda di che oggetto creo, se auto o moto, dirgli quale file leggere?
provo a spiegarmi meglio.
penso sia abbastanza stupido avere il mio costruttore Veicoli () { attributi vari }, e poi quando devo fare il costruttore di auto e moto, fare Automobili/Moto () {Veicoli();} (se questa strada non prevede che mi sbraniate allora il mio problema è risolto) a cui passo il nome della classe che lo sta chiamando.
quindi, apparte mettere queste 2 variabili nelle 2 sottoclassi, c'è un altro modo per fare la cosa?

70 Risposte

  • Re: Superclasse/sottoclasse

    Il costruttore di una sottoclasse DEVE SEMPRE chiamare il costruttore della superclasse COME PRIMA COSA.

    Anche su non lo fai, lo fa il compilatore al posto tuo.

    Il costruttore puo' avere parametri, quindi puoi passare il nome del file.

    Una classe vede SOLO se stessa e le superclassi, MAI le sottoclassi, quindi se devi inizializzare qualcosa lo devi fare in modo intelligente: ad esempio usando metodi virtuali, visibili nella superclasse, ma implementati in modi diversi nelle sotto classi
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    allora io ho la mia superclasse (veicoli, per chi ormai mi "segue" ) e 2 sottoclassi, una moto e una automobili
    Iniziamo con nomi buoni: Veicolo, Automobile, Moto
    Ciascun oggetto di questi "modella" una singola cosa, non più di una!

    KuroKami69 ha scritto:


    ora, posso in qualche modo, nel costruttore di veicolo, fare in modo che a seconda di che oggetto creo, se auto o moto, dirgli quale file leggere?
    Se una classe ha già uno scopo principale (es. "modellare" una entità come veicolo, o più specificatamente automobile/moto), allora dovrebbe fare principalmente solo quello. In sostanza: nelle tue classi Veicolo/Automobile/Moto NON devi leggere/scrivere file, NON devi chiedere input all'utente o fare altro che sia palesemente differente dallo scopo principale della classe.

    Se vuoi leggere veicoli da file, farai un'altra classe es. LettoreVeicoli

    Tu dirai: ma facendo così vengono fuori molte classi. La risposta è SÌ. In Java, e nella programmazione "ad oggetti" in generale, più rendi le classi focalizzate su un singolo obiettivo e meglio è. E questo significa di conseguenza avere potenzialmente molte classi. Tienilo bene a mente se vuoi continuare con Java.
  • Re: Superclasse/sottoclasse

    Mmmhh quindi allora tutti gli attributi comuni li lascio su veicolo, e mi faccio una classe che mi va a leggere i vari file per poi assegnarmi i valori. ma devo comunque spostare marca e modello nelle sottoclassi giusto? Voglio dire, non posso farlo in veicolo perchè veicolo non sa nulla delle sottoclassi quindi non può impostare correttamente i valori
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    Mmmhh quindi allora tutti gli attributi comuni li lascio su veicolo, e mi faccio una classe che mi va a leggere i vari file per poi assegnarmi i valori. ma devo comunque spostare marca e modello nelle sottoclassi giusto?
    Sbagliato. Marca e modello sono concetti generici di qualunque veicolo. Quindi hanno senso in Veicolo.

    KuroKami69 ha scritto:


    non posso farlo in veicolo perchè veicolo non sa nulla delle sottoclassi quindi non può impostare correttamente i valori
    E che vuol dire? I campi/getter/setter di marca/modello li metti in Veicolo. Mica c'entrano le sotto-classi!

    Credo che ... hai ancora parecchia confusione ..
  • Re: Superclasse/sottoclasse

    Si, ho parecchia confusione!
    cioè te mi staresti dicendo che nel costruttore di veicolo io devo lasciare vuoti i valori di marca e modello, e poi nelle sottoclassi richiamarli con un get e impostarli?
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    Si, ho parecchia confusione!
    cioè te mi staresti dicendo che nel costruttore di veicolo io devo lasciare vuoti i valori di marca e modello, e poi nelle sottoclassi richiamarli con un get e impostarli?
    No. Questo di seguito è l'esempio su cui dovresti ragionare:
    public class Veicolo {
        private String marca;
        private String modello;
    
        public Veicolo(String marca, String modello) {
            this.marca = marca;
            this.modello = modello;
        }
    
        // metodi getMarca/setMarca ; getModello/setModello
    
        // altro eventuale (es. equals, hashCode, toString)
    }
    public class Automobile extends Veicolo {
        private double capacitaBagagliaio;
    
        public Automobile(String marca, String modello, double capacitaBagagliaio) {
            super(marca, modello);
            this.capacitaBagagliaio = capacitaBagagliaio;
        }
    
        // metodi getCapacitaBagagliaio/setCapacitaBagagliaio
    
        // altro eventuale (es. equals, hashCode, toString)
    }
    Vedi come il costruttore di Automobile riceve tutti i dati, di cui alcuni li passa al super-costruttore (è così che lo "stato" in Veicolo viene inizializzato) e l'altro lo tiene per inizializzare il proprio campo?

    Nota che questi due costruttori di per sé NON sono obbligatori. Se non ci fossero, vorrebbe semplicemente dire che lo stato dell'oggetto DEVE essere impostato valore per valore tramite i metodi setter.
    Il costruttore permette di inizializzare fin da subito lo stato dell'oggetto. Questo permetterebbe ad esempio di NON mettere i setter (se si vuole una classe di oggetti "immutabili").
  • Re: Superclasse/sottoclasse

    Aaaaaaaaaaaaaaaaaaaaaaaaa ora ho capito
    ieri in classe la prof ha spiegato che quel super(marca, modello); era solo una specie di chiamata al costruttore di veicolo (ora non riesco a spiegarmi meglio. ora ho capito come funziona! ok grazie!
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    Aaaaaaaaaaaaaaaaaaaaaaaaa ora ho capito
    Aaaaaaaaa finalmente! Come hai visto, ciascuna classe si preoccupa di inizializzare la propria parte di "stato" dell'oggetto. Veicolo non "sa" (giustamente) nulla di Automobile, quindi si preoccupa solo dei suoi campi. Anche Automobile si preoccupa solo dei suoi campi. Ma se c'è un costruttore che riceve tutti i dati, sapendo che estende Veicolo gliene passerà alcuni. Alla fin fine il ragionamento è tutto qui.

    Quindi: per ciascuna classe ragiona e valuta cosa è appropriato per il senso di quella classe. Più estendi con sotto-classi e più specializzi. La ereditarietà rende possibile avere tra le classi una relazione di generalizzazione/specializzazione. La super-classe è un caso più generico, la sotto-classe è un caso più specifico.
  • Re: Superclasse/sottoclasse

    Ho capito. grazie
    quindi sostanzialmente, giusto per vedere se effettivamente ho capito, iodovrò farmi una nuova classe, che chiamerò, non lo so, letturaDati, dove ci metterò tutti i metodi che leggeranno i valori da file.
    dopodiché quando io richiamo il costruttore di veicolo in quello di automobile, farò un qualcosa tipo
    super(setMarca(), setModello() ecc) giusto?
    se la classe letturaDati la implemento in automobile e moto, come viene vista, e come la dovrei usare? ma soprattutto, va bene farlo?
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    iodovrò farmi una nuova classe, che chiamerò, non lo so, letturaDati, dove ci metterò tutti i metodi che leggeranno i valori da file.
    Io dicevo es. LettoreVeicoli ma bisogna vedere se deve leggere N veicoli o uno solo (e se di un tipo preciso o promiscuo). E chiaramente bisogna stabilire il formato/struttura del file.

    KuroKami69 ha scritto:


    dopodiché quando io richiamo il costruttore di veicolo in quello di automobile, farò un qualcosa tipo
    super(setMarca(), setModello() ecc) giusto?
    No. Il modo/concetto giusto è quello che ti ho esposto prima.

    KuroKami69 ha scritto:


    se la classe letturaDati la implemento in automobile e moto
    No. Automobile/Moto non devono "sapere" nulla di LettoreVeicoli (o come vorrai chiamarlo).

    KuroKami69 ha scritto:


    e come la dovrei usare?
    Prima chiarisci cosa/quanto contiene il file dei dati .... poi si potrà vedere come delineare la classe di lettura.

    P.S. eventualmente apri un'altra discussione ... non vorrei che anche qui facciamo un miscuglio enorme ..
  • Re: Superclasse/sottoclasse

    Allora, te hai detto che automobile, veicolo e moto non devono avere letture da file. io da file leggo:
    1) marca
    2) modello
    3) tipologia del veicolo
    4) costo del veicolo
    5) consumo del veicolo
    6) cilindrata
    7) cilindri (solo per le moto)
    cavalli
    9) massa a vuoto
    quindi questi metodi qua, li metterò in una classe a parte. questi metodi qua poi andrò a richiamarli in auto e moto giusto? penso di si. quindi a me basta calibrarli in modo che mi leggano il file appropriato. quello che non capisco a livello di codice è: dove questi valori poi li passo a veicolo. forse, e dico forse, è una cosa simile?
    public Automobile(String marca, String modello, ecc){super(marca, modello, ecc);}
    automobile(setMarca, setModello, ecc);
    può essere?
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    1) marca
    2) modello
    3) tipologia del veicolo
    4) costo del veicolo
    5) consumo del veicolo
    6) cilindrata
    7) cilindri (solo per le moto)
    cavalli
    9) massa a vuoto
    quindi questi metodi qua
    No, questi NON diventeranno metodi di una classe es. LettoreVeicolo (o quello che sarà).

    KuroKami69 ha scritto:


    poi andrò a richiamarli in auto e moto giusto? penso di si.
    No.


    Ripeto la questione (se l'hai chiara per te ok ma dovresti esporla qui): precisa bene COSA contiene il file (scrivi magari proprio un esempio di file), indicando se contiene 1 o N veicoli. E se di tipo ben preciso (es. solo automobili) o in modo promiscuo.
  • Re: Superclasse/sottoclasse

    Ma, secondo me hai frainteso.
    i miei file .txt contengono solo liste di marche, modelli, scaglioni di prezzi e via dicendo. non contengono null'altro
    mi hai detto che ne auto ne moto ne veicolo devono leggere da file, quindi mi sembra di aver capito che i metodi che leggono da file devono essere messi su una classe a parte. ti posto i file che uso. purtroppo sono su , comunque è uno zip di poki kb contenente tutti i txt che uso
  • Re: Superclasse/sottoclasse

    KuroKami69 ha scritto:


    Ma, secondo me hai frainteso.
    Mi spiace, non ho frainteso proprio niente.

    KuroKami69 ha scritto:


    ti posto i file che uso.
    Mi spiace, quei file li ho visti e .... sono parecchio insensati. Non c'è (perlomeno non si vede ... e se anche ci fosse sarebbe un "segreto" che sai solo tu) alcuna correlazione tra i dati nei vari file.
    Che senso ha avere un file (e dove lo useresti?) che contiene solo le 80 marche di auto???

    Non ci siamo proprio. E continui a non avere le idee chiare.

    Hai una classe es. Automobile e vuoi "tirar su" da file 1 o più oggetti Automobile? Bene, allora PENSA e CHIARISCI il formato/struttura di file appropriato. Punto.
Devi accedere o registrarti per scrivere nel forum
70 risposte