Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    esercizio ereditarietà..

    main
    codice:
    package fiat;
    import java.util.*;
    
    public class Test {
    
    	
    	public static void main(String[] args) {
    ArrayList<Auto> auto= new ArrayList<Auto>(); 
    Random rnd = new Random();
    
    	int tipo = rnd.nextInt(2);
    	int targa;
    	int kmtotali=0;
    	double benzinatotale=0;
    	for (int x=0; x<30;x++){
    		switch(tipo){
    			case 0:
    				targa = rnd.nextInt(999999);
    				auto.add(new Panda (targa));
    			case 1:
    				targa = rnd.nextInt(999999);
    				auto.add(new Panda (targa));
    			case 2:
    				targa = rnd.nextInt(999999);
    				auto.add(new Panda (targa));
    		}}
    		
    		for (int i=0; i<100;i++){
    			int x = rnd.nextInt(29);
    			int km = rnd.nextInt(100);          //errore: viaggia tra 10 e 100km
    			auto.get(x).viaggia(km);
    		}
    		for (Auto a : auto){
    			kmtotali+=a.getKmpercorsi();
    			benzinatotale+=a.getBenzinaConsumata();
    		}
    		System.out.println("km totali: "+kmtotali+ " benzinaconsumata: "+benzinatotale);
    		
    	}
    
    }
    superclasse
    codice:
    package fiat;
    
    public abstract class Auto {
    	public Auto (int targa){
    		
    	}
    public void viaggia (int km){
    	kmpercorsi+=km;
    }
    private int kmpercorsi=0;
    
    public int getKmpercorsi(){
    	return kmpercorsi;
    }
     public abstract double getBenzinaConsumata();
    }
    una delle sottoclassi
    codice:
    package fiat;
    
    public class Panda extends Auto{
    	public Panda (int targa){
    		super(targa);
    		
    	}
    	private int kmpercorsi;
    	private double benzinaconsumata;
    	
    	public double getBenzinaConsumata(){
    	benzinaconsumata=kmpercorsi/21;
    	return benzinaconsumata;
    	}
    
    }
    lo scopo dell'esercizio è creare a caso 30 auto tra i 3 modelli. Successivamente per 100 volte sceglie un’auto a caso tra quelle create ed invocare il metodo viaggia con una quantità di km compresa tra 10 e 100 km.
    Al termine stampare il totale dei km percorsi da tutte le auto e la quantità di benzina consumata.


    -le sottoclassi differiscono solo dai km/l per questo ne ho postato una sola.
    -ho notato che mi crea solo Panda e non conta la benzina consumata.
    -dovrei invocare viaggia tra 10 e 100km, come noterete ho messo un random(100) xke non so come definire il range.
    -inoltre se nel for each stampo tutti gli elementi mi trovo 60 auto create quando ne dovrebbero essere 30.

    sono sicuro che sono errori stupidi che mi sfuggono da sotto gli occhi

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

    Re: esercizio ereditarietà..

    Originariamente inviato da ant_alt
    -ho notato che mi crea solo Panda
    Beh, ma scusa ... nel codice vedo solo dei new Panda ... se hai altre sottoclassi, allora istanziale a seconda del valore di 'tipo'.

    Originariamente inviato da ant_alt
    e non conta la benzina consumata.
    Intanto vedo delle cose che non vanno in Auto e Panda. Per iniziare, il valore di targa passato al costruttore non lo assegni ad una variabile di istanza (che dovrebbe essere in Auto). Magari non ti serve, al momento .... ok allora.

    Poi vedo che c'è una variabile di istanza 'kmpercorsi' in Auto ma ce n'è una anche in Panda. Non va bene.
    Ragiona: cosa cambia da una sottoclasse all'altra?? Solo il consumo di benzina. Il concetto di "viaggiare" è comune e uguale a tutte le Auto, quindi viaggia() deve essere implementato in Auto (come hai fatto). Il concetto dei km percorsi pure, visto che è legato a quanto appena detto. Quindi la variabile di istanza kmpercorsi e il metodo getKmpercorsi() devono stare solo in Auto.

    Il concetto della "benzina consumata" è quello che cambia tra le sottoclassi, infatti non è implementato in Auto (getBenzinaConsumata() è correttamente abstract) proprio perché Auto è il termine generico ... astratto, ed è poi in una sottoclasse specifica che devi implementare il metodo in modo da fare il calcolo secondo il tipo "reale" di auto.

    Originariamente inviato da ant_alt
    -dovrei invocare viaggia tra 10 e 100km, come noterete ho messo un random(100) xke non so come definire il range.
    Banalmente, in generale, sommando un valore che fa da base:

    10 + random.nextInt(91);

    random.nextInt(91) fornisce valori tra 0 e 90 entrambi inclusi (il valore 91 passato è escluso!) quindi con la somma si ha un valore tra 10 e 100.

    Originariamente inviato da ant_alt
    -inoltre se nel for each stampo tutti gli elementi mi trovo 60 auto create quando ne dovrebbero essere 30.
    Mancano i break per ogni case, quindi si ha il "fall through", cioè si passa attraverso tutti i case successivi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Comunque in switch (tipo), il case 2 non verrà mai eseguito dato che a tipo hai fatto = rnd.nextInt (2). I valori che possono uscire sono 0 o 1, ma mai 2

  4. #4
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    Re: Re: esercizio ereditarietà..

    Originariamente inviato da andbin
    Poi vedo che c'è una variabile di istanza 'kmpercorsi' in Auto ma ce n'è una anche in Panda. Non va bene.
    Ragiona: cosa cambia da una sottoclasse all'altra?? Solo il consumo di benzina. Il concetto di "viaggiare" è comune e uguale a tutte le Auto, quindi viaggia() deve essere implementato in Auto (come hai fatto). Il concetto dei km percorsi pure, visto che è legato a quanto appena detto. Quindi la variabile di istanza kmpercorsi e il metodo getKmpercorsi() devono stare solo in Auto.

    innanzitutto grazie della risposta più che esaustiva

    xò: la benzina consumata dall'istanza la calcolo con kmpercorsi/consumo della sottoclasse...

    come faccio se non ho kmpercorsi come variabile?




    ps: senza aprire un altro thread sullo stesso argomento chiedo qui: in un altro esercizio ho questo problema:
    mi serve semplicemente un metodo che prenda come argomenti due oggetti Spedizioni e li scambi (ovviamente sped è un ArrayList di Spedizioni)
    codice:
    Spedizioni tmp;
    sped.get(x)= temp;
    sped.get(x+1) =sped.get(x);
    sped.get(x+1)= temp;
    penso ci sia qlc che non va nel codice, cmq la domanda principale è un altra: dove lo definisco un metodo del genere (ossia che preleva dall'arrayList che è creato in fase di runtime random come l'esercizio postato prima?)

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

    Re: Re: Re: esercizio ereditarietà..

    Originariamente inviato da ant_alt
    come faccio se non ho kmpercorsi come variabile?
    Ma c'è il metodo getter getKmpercorsi()!!!
    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
    Feb 2004
    Messaggi
    2,803

    Re: Re: Re: Re: esercizio ereditarietà..

    Originariamente inviato da andbin
    Ma c'è il metodo getter getKmpercorsi()!!!

    quindi nel costruttore delle sottoclassi faccio una cosa del genere?

    benzinaconsumata=this.kmpercorsi/16;

    o è più corretto

    benzinaconsumata=this.getKmpercorsi()/16;

    (nota che kmpercorsi nella superclasse è inizializzato a 0)

    mica violo l'incapsulamento con un accesso del genere alla variabile kmpercorsi nel primo caso?

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

    Re: Re: Re: Re: Re: esercizio ereditarietà..

    Originariamente inviato da ant_alt
    benzinaconsumata=this.kmpercorsi/16;

    o è più corretto

    benzinaconsumata=this.getKmpercorsi()/16;

    (nota che kmpercorsi nella superclasse è inizializzato a 0)

    mica violo l'incapsulamento con un accesso del genere alla variabile kmpercorsi nel primo caso?
    Innanzitutto se in Auto la variabile 'kmpercorsi' è private, allora non è accessibile dalle sottoclassi!! Quindi devi per forza usare il metodo getter.

    Poi comunque c'è una questione concettuale. Quello che cambia tra le sottoclassi non è tanto un "comportamento" ma una "proprietà", ovvero il fattore che è il numero di km/litro.

    Quindi si potrebbe mettere in Auto una variabile di istanza kmPerLitro, ricevuta dal costruttore di Auto e le sottoclassi nel loro costruttore passano un valore fisso al super-costruttore. Quindi si potrebbe avere solo in Auto il metodo getBenzinaConsumata(), ovviamente implementato per fare il calcolo.

    Vedi la questione?? Ciò che cambia non è un "comportamento". Nelle sottoclassi non ci sono metodi la cui implementazione può cambiare radicalmente.
    A quel punto nemmeno le sottoclassi avrebbero davvero senso ... difatti potresti concettualmente avere solo delle Auto e fare: new Auto(12345, 21) cioè passare targa e fattore di km/litro. Ovvero la targa e il fattore sono delle "proprietà".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8

    Re: Re: Re: Re: Re: Re: esercizio ereditarietà..

    Originariamente inviato da andbin

    A quel punto nemmeno le sottoclassi avrebbero davvero senso ... difatti potresti concettualmente avere solo delle Auto e fare: new Auto(12345, 21) cioè passare targa e fattore di km/litro. Ovvero la targa e il fattore sono delle "proprietà".
    vero quello che dici. Però ha senso modellare la realtà così com'è stato proposto (usando una classe per ogni modello: panda, uno etc etc) perché in quel caso non è chi usa la classe a istanziarla con il consumo (che è un dato che può non conoscere) ma istanziando il modello (panda, per esempio). In questo caso il modello (insieme alla targa!) diventa l'unica cosa che conosce del proprio mondo. Sarà il modello stesso (e quindi la classe che lo implementa) a conoscere i suoi dettagli (per esempio il consumo).

    Diciamo che se è solo il consumo a cambiare, forse l'ereditarietà risulta essere una soluzione non ottimale; ma credo che ai fini dell'esercizio (mostrare il polimorfismo) sia accettabile...

    p.s. ovviamente questo significa che gli attributi sono tutti nella superclasse! I figli semplicemente assegnano opportunamente i valori a tali attributi!!
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

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

    Re: Re: Re: Re: Re: Re: Re: esercizio ereditarietà..

    Originariamente inviato da ivenuti
    perché in quel caso non è chi usa la classe a istanziarla con il consumo (che è un dato che può non conoscere)
    Anche tu hai ragione. La mia ultima frase era solo una disquisizione teorica ... concettuale.

    Comunque l'ho anche detto .... si potrebbe avere una variabile kmPerLitro in Auto e questo valore viene passato al super-costruttore da ogni sottoclasse. In questo caso si rimane nella situazione che dicevi tu, cioè è la sottoclasse che "sa" il consumo.

    Il punto che volevo far notare era il fatto che getBenzinaConsumata() in realtà non ha un "comportamento" diverso nelle varie sottoclassi ... tutte farebbero lo stesso tipo di calcolo. Proprio perché quello che cambia è solo una "proprietà" cioè il consumo.

    Originariamente inviato da ivenuti
    Diciamo che se è solo il consumo a cambiare, forse l'ereditarietà risulta essere una soluzione non ottimale; ma credo che ai fini dell'esercizio (mostrare il polimorfismo) sia accettabile...

    p.s. ovviamente questo significa che gli attributi sono tutti nella superclasse! I figli semplicemente assegnano opportunamente i valori a tali attributi!!
    Ok concordo. Guarda ... noi (io e te) le precisazioni le abbiamo fatte. Spetta a ant_alt scegliere cosa è meglio fare per il suo esercizio.
    Grazie delle precisazioni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    letto tutto
    essendo un esecizio basato anche sull'ereditarietà, lascio la superclasse..al di là delle vostre giustissime osservazioni

    ma continuo a notare che benzina consumata non funge


    ps:anche targa


    nell'allegato ho fatto un for each che stampa tutto l'ambaradàn
    non serve ai fini dell'esercizio ma chiarisce tutto

    qualcuno può darmi un braccio a finire sto esercizio?


    www.nabbaitalia.it/fiat.zip

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.