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

    [java]restituire un'istanza di un oggetto

    il problema e' un po duro da spiegare: facciamo che ho una classe, con un metodo che in base al numero inserito mi restituisce, in una varibile che io ho definito com Object generico, un'istanza di una classe. ex: se il numero e' 1 mi restituisce l'istanza della classe a, se e' 2 l'istanza della classe b ecc...quindi avro'

    Object var = instanza di a....

    se adesso io volessi chiamare un metodo di a (premetto che a,b,c ecc...hanno N metodi dello stesso nome) e facessi a.metodo() mi da errore, perche' a quanto ho capito, a e' un object generico e non "eredita" i metodi...ora mi chiedo: come posso fare a risolvere il mio problema?? (sempre che abbiate capito di che parlo??)
    eXtending-Php.net coming soon ...

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    if (var instanceof A)
    ((A)var).metodo();
    e così per le classi che potrebbe tornare

  3. #3
    quindi devo vedere se la var a e' un'istanza di una classe o di un'altra??
    eXtending-Php.net coming soon ...

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    con instanceof sai a quale classe potrebbe appartenere
    con (A) casti l'oggetto

  5. #5
    scusate se scasso ancora, ma cosa sbagli qui?
    codice:
    class Regolare{
    	Object f;
    	Regolare(int lati,float lunghezza){
    		switch(lati){
    			case 3:
    			f = new Triangolo(lati,lunghezza);
    			break;
    			case 4:
    			f = new Quadrato(lati,lunghezza);
    			break;
    		}
    	}
    	Object getObj(){
    		return f;
    	}
    }
    class Triangolo{
    	int lati;
    	float lunghezza;
    	Triangolo(int a,float b){
    		lati = a;
    		lunghezza = b;
    	}
    	float perimetro(){
    		return (lati*3);
    	}
    }
    class Quadrato{
    	int lati;
    	float lunghezza;
    	Quadrato(int a,float b){
    		lati = a;
    		lunghezza = b;
    	}
    	float perimetro(){
    		return (lati*4);
    	}
    }
    class poligono{
    	public static void main(String[] args){
    		Object forma;
    		Regolare r = new Regolare(3,5.7);
    		forma = r.getObj();
    		if(forma istanceof(Triangolo)){
    			Triangolo f = (Triangolo)forma;
    		}else if(forma istanceof(Quadrato)){
    			Quadrato f = (Quadrato)forma;
    		}
    		System.out.print(f.perimetro());
    	}
    penso che sia un problema di tipi di dato, ma nn so dove sbaglio...
    eXtending-Php.net coming soon ...

  6. #6
    che errore ti da?

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Un'errore e' nella restituzione del perimetro.
    Ad esempio nel triangolo restituisci lati*3 (cioe' 9), in realta' devi restituire lati * lughezza, altrimenti non ha senso.
    E comunque e' tutto il concetto a non stare in piedi.
    Per utilizzare il polimorfismo dovresti partire da una superclasse astratta chiamata Poligono, la quale ha un metodo area e un metodo perimetro, che restituiscono rispettivamente area e perimetro dell'oggetto in questione.
    Poi ogni figura che intendi implementare estende la classe Poligono e fornisce una corretta implementazione dei metodi.
    Di conseguenza dal tuo programma principale agisci sempre su un oggetto di tipo Poligono, ci pensa poi il linguaggio a run time ad eseguire il corretto metodo, in base all'effetiva natura dell'oggetto che sta utilizzando.
    Esempio veloce (e non testato, non ricordo dove vanno messe le parole chiave abstract)
    codice:
    class abstract Poligono {
      public abstract double perimetro() {}
      public abstract double area() {}
    }
    
    class Quadrato extends Poligono {
      private double lato;
      Quadrato( double l) {
        lato = l;
      }
      public double perimetro() {
        return lato*4;
      }
      public double area() {
        return lato*lato;
      }
    }
    class Cerchio extends Poligono {
      private double raggio;
      Quadrato( double l) {
        raggio = l;
      }
      public double perimetro() {
        return 2*raggio*Math.PI;
      }
      public double area() {
        return raggio*raggio*Math.PI;
      }
    }
    class prova {
      public static void main(String args[]) {
        Poligono p;
        Quadrato q = new Quadrato( 19.5);
        Cerchio c = new Cerchio( 100);
        p = q;
        System.out.println( p.perimetro());
        System.out.println( p.area());
        p = c;
        System.out.println( p.perimetro());
        System.out.println( p.area());
      }
    }
    Come vedi chiamo sempre i metodi di un generico poligono, che faccio riferire una volta ad un cerchio e una volta ad un quadrato.
    Se poi in futuro volessi implementare un'altra figura, ad esempio il triangolo, estendendo la classe Poligono il tutto funzionerebbe senza bisogno di modifiche, se non al main.
    Ciao,
    Lorenzo

  8. #8
    hai proprio ragione tu...il problema stà nel fatto che mi mncavano alcuni concetti base (tipo abstract), e non sono ancora riuscito ad abituarmi ai tipi di dato, perchè vengo da linguaggi senza dichiarazione di varibili..comunque vedo se può servre per quello ch intendo fare..grazias
    eXtending-Php.net coming soon ...

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.