1
resposta

Visitor

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);

}

}

1 resposta

Opa, o problema dessa herança é que quando aparecer um dado que deva fazer parte de 3 das 4 classes, onde vc vai deixar? repetir entre as 3 ou deixar na mãe e fazer com que a quarta não use?

Esse é um caso clássico de herança.. Um exemplo bobo, mas que tem relação é: Um cachorro tem rabo e 4 patas, um gato também, logo um gato herda de cachorro. Eu prefiro deixar separado :).