Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Sto imparando il polimorfismo, ho bisogno di aiuto

    Salve ragazzi.

    Ho un piccolo problema. Sono uno studente lavoratore e purtroppo non ho potuto partecipare alle lezioni di java, quindi sto provando ad impararmi tutto da solo.

    Sto svolgendo questo esercizio:


    [Rettangoli, quadrati e aree] Scrivete un programma che chieda all'utente di inserire una sequenza di aree di figure geometriche (le aree sono al massimo 100, tutte costituite da numeri interi, e terminate da 0). Dopo aver chiesto ciascuna area, il programma chiede all'utente di inserire la misura del lato (che deve essere un divisore dell'area). A seconda dei casi, il programma creerà un rettangolo o un quadrato. Alla fine, verranno stampate le misure dei rettangoli e quadrati inseriti, nell'ordine in cui sono stati inseriti.
    Ad esempio (le parti in grassetto sono inserite dall'utente):
    Area: 15
    Lato: 3
    Area: 16
    Lato: 4
    Area: 17
    Lato: 1
    Area: 0
    Rettangolo -- base = 3.0; altezza = 5.0
    Quadrato -- lato = 4.0
    Rettangolo -- base = 1.0; altezza = 17.0
    Suggerimento: per questo esercizio, dovete sfruttare il polimorfismo e il predicato instanceof.
    Ok ora io sto provando a costruire una classe per i dati, per ora ho scritto questo codice:

    codice:
    import prog.io.ConsoleInputManager;
    import prog.io.ConsoleOutputManager;
    
    
    public class AreaFigure {
    
    	public static void main(String[] args) {
    		ConsoleInputManager in = new ConsoleInputManager();
    		ConsoleOutputManager out = new ConsoleOutputManager();
    		
    		Riconosci();
    		
    	}
    
    
    
    public static void Riconosci() {
    	ConsoleInputManager in = new ConsoleInputManager();
    	ConsoleOutputManager out = new ConsoleOutputManager();
    	
    	Figura f = new Figura();
    	
    	f.area=0;
    	f.lato=0;
    	
    	
    	f.area = in.readInt("inserisci l'area");
    	
    	if (f.area == 0) return;
    	
    	f.lato = in.readInt("inserisci lato");
    	
    	if (f.area % f.lato != 0) return;
    	
    	Riconosci();
    	
    }
    
    
    	
    
    	class Figura {
    		int area;
    		int lato;
    	}
    
    	class Quadrato extends Figura {
    		boolean V;
    	}
    
    	class Rettangolo extends Figura {
    		int altezza;
    	}
    
    
    	}

    Dove prog.io è un .jar che ci ha dato il prof per gestire l'input output di eclipse 2.2 (io lo uso su ubuntu 7.10).

    Ecco mi da vari tipi di errore al comando:

    Figura f = new Figura();


    evidentemente sbaglio qualcosa nell'inizializzazione. Potete darmi una mano? grazie mille!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ci sono diverse questioni, sia concettuali che tecniche. Innanzitutto non è buona cosa usare le classi come delle semplici "strutture" da usare solo come deposito di dati ... un po' come le strutture del "C", tanto per dire. Sarebbe necessario realizzare una corretta "incapsulazione" dello stato nelle classi.

    Le classi le hai pure dichiarate dentro la classe AreaFigure. Tecnicamente non è sbagliato, Java permette la dichiarazione di tipi dentro altri tipi. Ma se non ci sono motivi particolari, dichiarale tranquillamente come "top-level", cioè fuori da ogni classe.

    Poi è vero che Figura è la classe base di Quadrato e Rettangolo ma questo non vuol dire che deve avere una proprietà "lato" soltanto perché ti fa comodo poterla "ereditare" nelle due sottoclassi che in effetti necessitano di un "lato". E se ti faccio una sottoclasse Cerchio???
    Bisognerebbe pensare meglio a cosa rappresentano le classi e quindi strutturare la gerarchia di classi in modo da suddividere in modo corretto il compito tra le varie classi.

    Ad esempio: ha senso poter creare una istanza di Figura?? Credo proprio di no. In questo senso una figura non è una cosa concreta ... è un termine generico. In tal caso la classe Figura sarebbe anche più appropriato marcarla come 'abstract'.

    Nel tuo codice vedo che fai una chiamata ricorsiva a Riconosci(). Non è proprio un errore ma normalmente una cosa del genere non ha senso e non serve, se devi solo far ripetere un blocco di codice. È più appropriato sfruttare i cicli, ad esempio un do-while.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Originariamente inviato da andbin
    Ci sono diverse questioni, sia concettuali che tecniche. Innanzitutto non è buona cosa usare le classi come delle semplici "strutture" da usare solo come deposito di dati ... un po' come le strutture del "C", tanto per dire. Sarebbe necessario realizzare una corretta "incapsulazione" dello stato nelle classi.

    Le classi le hai pure dichiarate dentro la classe AreaFigure. Tecnicamente non è sbagliato, Java permette la dichiarazione di tipi dentro altri tipi. Ma se non ci sono motivi particolari, dichiarale tranquillamente come "top-level", cioè fuori da ogni classe.
    si ma non mi compila! dov'è l'errore? cioè come faccio ad usare le classi di dati?

    Poi è vero che Figura è la classe base di Quadrato e Rettangolo ma questo non vuol dire che deve avere una proprietà "lato" soltanto perché ti fa comodo poterla "ereditare" nelle due sottoclassi che in effetti necessitano di un "lato". E se ti faccio una sottoclasse Cerchio???
    Bisognerebbe pensare meglio a cosa rappresentano le classi e quindi strutturare la gerarchia di classi in modo da suddividere in modo corretto il compito tra le varie classi.
    no le figure possibili sono solo quadrati e rettangoli. E' un esercizio didattico, fosse per me non avrei neanche usato il polimorfismo

    Nel tuo codice vedo che fai una chiamata ricorsiva a Riconosci(). Non è proprio un errore ma normalmente una cosa del genere non ha senso e non serve, se devi solo far ripetere un blocco di codice. È più appropriato sfruttare i cicli, ad esempio un do-while.
    come sopra è a puro scopo didattico.
    La ricorsione è uno strumento tanto potente quanto complicato, quindi cerco di usarlo tutte le volte che posso.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Mascarpone
    si ma non mi compila! dov'è l'errore?
    Proprio per il fatto che ho detto prima, cioè che hai dichiarato le classi dentro AreaFigure. Le tue classi sono infatti delle "inner-class". Per poter istanziare una inner-class, bisogna avere una istanza della classe che la contiene da associare alla inner-class.

    Ma tu sei in un metodo statico e quindi non c'è il 'this' che fa riferimento ad una istanza di AreaFigure. Potresti certamente fare:

    AreaFigure af = new AreaFigure ();
    Figura f = af.new Figura();

    che è un modo corretto per istanziare una inner-class. Ma torniamo ad un'altra questione: e cioè che non ha senso complicarsi la vita e fare una cosa del genere che non ti serve.
    Se non conosci le regole sulle inner-class ..... non usarle.

    Originariamente inviato da Mascarpone
    come sopra è a puro scopo didattico.
    La ricorsione è uno strumento tanto potente quanto complicato, quindi cerco di usarlo tutte le volte che posso.
    Ottimo .... continua così .... :rollo:
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Proprio per il fatto che ho detto prima, cioè che hai dichiarato le classi dentro AreaFigure. Le tue classi sono infatti delle "inner-class". Per poter istanziare una inner-class, bisogna avere una istanza della classe che la contiene da associare alla inner-class.

    Ma tu sei in un metodo statico e quindi non c'è il 'this' che fa riferimento ad una istanza di AreaFigure. Potresti certamente fare:

    AreaFigure af = new AreaFigure ();
    Figura f = af.new Figura();

    che è un modo corretto per istanziare una inner-class. Ma torniamo ad un'altra questione: e cioè che non ha senso complicarsi la vita e fare una cosa del genere che non ti serve.
    Se non conosci le regole sulle inner-class ..... non usarle.
    Grazie mille, corretto. Adesso finisco il progetto e poi posto il sorgente cosi qualcun'altro potrà usarlo per capire.

    E per le inner-class: è proprio il caso che domani in biblioteca mi prenda un manuale di java e me le studi bene!!!

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.