Teria algum problema eu mudar a interface Expressão pra uma classe abstrata e colocar os atributos em comum nela fazendo com que as subclasses que a estendam não precisem repetir os mesmo atributos toda vez? As subclasses Soma, Subtração, Divisão e outras operações teriam o esquerda e direita, não seria melhor concentrar em um só lugar?
package interpreter;
public abstract class Expressao {
protected Expressao esquerda; protected Expressao direita;
abstract int avalia(); abstract void aceita(Visitor visitor);
public Expressao getEsquerda() { return this.esquerda; }
public Expressao getDireita() { return this.direita; } }
package interpreter;
public class Soma extends Expressao {
Soma(Expressao esquerda, Expressao direita) { this.esquerda = esquerda; this.direita = direita;
}
@Override public int avalia() {
return this.esquerda.avalia() + this.direita.avalia(); }
void aceita(Visitor visitor) { visitor.visitaSoma(this);
}
}
package interpreter;
public class Subtracao extends Expressao {
Subtracao(Expressao esquerda, Expressao direita) { this.esquerda = esquerda; this.direita = direita;
}
@Override public int avalia() {
return this.esquerda.avalia() - this.direita.avalia(); }
@Override void aceita(Visitor visitor) { visitor.visitaSubtracao(this);
}
}
package interpreter;
public class Numero extends Expressao {
private int numero;
Numero(int numero) { this.numero = numero; }
@Override public int avalia() {
return this.numero; }
public int getNumero() { // TODO Auto-generated method stub return this.numero; }
void aceita(Visitor visitor) { visitor.visitaNumero(this);
}
}