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

    Problema inner class + ridefinizione toString

    Salve gente,
    ho un problema con la ridefinizione del metodo toString. Praticamente ho una gerarchia di classi, e delle innerclass in cui ridefinisco il metodo toString. Quando però richiamo il metodo toString di una di queste innerClass esso non mi viene riconosciuto. Vi posto il codice delle inner class:

    codice:
    public class OperatoreNumerico {
    
    	EspressioneAritmetica left;
    	EspressioneAritmetica right;
    
    	public OperatoreNumerico() {
    		left = null;
    		right = null;
    	}
    
    	public OperatoreNumerico(String s) {
    		
    		if (s == "*")
    			new MUL();
    		if (s == "/")
    			new DIV();
    		if (s == "^")
    			new POWER();
    
    	}
    
    	@Override
    	public void setLeft(Espressione e) {
    		if (!(e instanceof EspressioneAritmetica)) {
    			System.out
    					.println("Ad un operatore logico possono essere assegnati solo espressioni booleane");
    			return;
    		}
    		left = e;
    	}
    
    	@Override
    	public void setRight(Espressione e) {
    		if (!(e instanceof EspressioneAritmetica)) {
    			System.out
    					.println("Ad un operatore logico possono essere assegnati solo espressioni booleane");
    			return;
    		}
    		right = e;
    
    	}
    
    	@Override
    	public Espressione getLeft() {
    		return left;
    	}
    
    	@Override
    	public Espressione getRight() {
    		return right;
    	}
    
    	public String toString() {// fittizio
    		String s = null;
    		if (this instanceof PLUS)
    			s = "" + left.toString() + " + " + right.toString();
    
    		return s;
    	}
    
    	public class POWER extends OperatoreNumerico {
    		public String toString() {
    			return left.toString() + " ^ " + right.toString();
    		}
    	}
    
    	public class MUL extends OperatoreNumerico {
    		public String toString() {
    			return left.toString() + " * " + right.toString();
    		}
    	}
    
    	public class DIV extends OperatoreNumerico {
    		public String toString() {
    			return left.toString() + " / " + right.toString();
    		}
    	}
    
    Adesso vi posto il pezzo del main in cui richiamo il toString:
                   OperatoreNumerico mul = new OperatoreNumerico("*");
    		Numero n1 = new Numero(5);
    		Numero n2 = new Numero(3);
                    mul.setLeft(n1);
    		mul.setRight(n2);
    		System.out.println(mul.toString());
    e questo è l'errore che mi da:

    Composite.OperatoreNumerico@164f1d0d
    In pratica richiama il toString di Object.. Perchè non viene effettuato l'overriding? In che cosa sbaglio?
    Maria

  2. #2
    Primo errore: nel costruttore confronti due stringhe con l'operatore ==, il che non va bene. String non è un tipo di dato primitivo in Java, pertanto le stringhe vengono trattate come veri e propri oggetti. Le stringhe vanno confrontate con il metodo equals (con == si confrontano i references degli oggetti che saranno diversi sicuramente):

    codice:
    if("*".equals(s)){
    ...
    }
    Secondo errore: per ogni confronto istanzi un oggetto... ma non viene assegnato a nessuna variabile... pertanto sarà "perso" immediatamente dopo.

    Terzo errore: i metodi get e set che hai scritto vengono annotati con @Override... ma cosa overridano se la classe così come l'hai scritta non estende nulla? (forse manca qualche pezzo di codice?)

    Quarto errore: la variabile mul sulla quale richiami il toString() è un oggetto di tipo OperatoreNumerico. A questo punto però, sempre in base a come hai postato il codice, io mi aspetto che venga stampato null, dato che "this" non è una istanza di PLUS (è un OperatoreNumerico) quindi dovrebbe ritornare il valore di s (che però è null).

    Al mio segnale... scatenate l'inferno!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Come indicato nel Regolamento interno, il codice va postato usando gli appositi tag CODE, per renderlo leggibile.

    Ho corretto io.


    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

  4. #4
    Ciao,
    ho corretto tutti gli errori.. Ho messo equals, ho assegnato la new degli oggetti Plus minus ecc ad un riferimento. E infine ho tolto gli override però non mi funziona lo stesso!! La mia domanda adesso è: anche se l'oggetto viene creato di tipo OperatoreNumerico in realtà sarà di un tipo plus o minus ecc. Il compilatore non dovrebbe riconoscere il tipo dinamico dell'oggetto e quindi richiamarne il toString?!
    Maria

  5. #5
    Originariamente inviato da mariella_88
    Ciao,
    ho corretto tutti gli errori.. Ho messo equals, ho assegnato la new degli oggetti Plus minus ecc ad un riferimento. E infine ho tolto gli override però non mi funziona lo stesso!! La mia domanda adesso è: anche se l'oggetto viene creato di tipo OperatoreNumerico in realtà sarà di un tipo plus o minus ecc. Il compilatore non dovrebbe riconoscere il tipo dinamico dell'oggetto e quindi richiamarne il toString?!
    Posta il nuovo codice che hai scritto (utilizzando il tag CODE come detto da Leleft)
    Al mio segnale... scatenate l'inferno!

  6. #6
    Ecco quello che ho fatto.. Ho creato due classi astratte per specificare il tipo Espressione ed EspressioneAritmetica..

    codice:
    public class OperatoreNumerico extends EspressioneAritmetica { Espressione left; Espressione right; Espressione root; public OperatoreNumerico() { left = null; right = null; } public OperatoreNumerico(String s) { if (s.equals("+")) root = new PLUS(); if (s.equals("-")) root = new MINUS(); if (s.equals("*")) root = new MUL(); if (s.equals("/")) root = new DIV(); if (s.equals("^")) root = new POWER(); if (s.equals("%")) root = new REM(); } public Espressione getRoot() { return root; } public void setLeft(Espressione e) { if (!(e instanceof EspressioneAritmetica)) { System.out .println("Ad un operatore aritmetico possono essere assegnati solo espressioni aritmetiche"); return; } left = e; } public void setRight(Espressione e) { if (!(e instanceof EspressioneAritmetica)) { System.out .println("Ad un operatore aritmetico possono essere assegnati solo espressioni aritmetiche"); return; } right = e; } public Espressione getLeft() { return left; } public Espressione getRight() { return right; } public class POWER extends OperatoreNumerico { public String toString() { return left.toString() + " ^ " + right.toString(); } } public class MUL extends OperatoreNumerico { public String toString() { return left.toString() + " * " + right.toString(); } } public class DIV extends OperatoreNumerico { public String toString() { return left.toString() + " / " + right.toString(); } } public class PLUS extends OperatoreNumerico { @Override public String toString() { return left.toString() + " + " + right.toString(); } } public class MINUS extends OperatoreNumerico { public String prova() { return "maria"; } @Override public String toString() { return left.toString() + " + " + right.toString(); } } public class REM extends OperatoreNumerico { public String toString() { return left.toString() + " % " + right.toString(); } } }
    e questo è il main dove richiamo il toString:
    codice:
    OperatoreNumerico plus = new OperatoreNumerico("+"); Numero n1 = new Numero(5); Numero n2 = new Numero(3); plus.setLeft(n1); plus.setRight(n2); System.out.println(plus.toString());
    L'errore è sempre lo stesso..
    Maria

  7. #7
    il toString() lo richiami sull'oggetto plus che è un OperatoreNumerico , pertanto, non avendolo ridefinito in questa classe, viene richiamato quello ereditato da Object (o EspressioneAritmetica se questa classe lo ridefinisce).

    Il toString che ti aspetti tu è quello sull'oggetto root di plus (è root ad essere una istanza di PLUS...):


    codice:
    plus.getRoot().toString()
    Al mio segnale... scatenate l'inferno!

  8. #8
    Ok grazie.. Ho risolto.. Grazie mille..
    Maria

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.