Oi Maurício, eu acho que essa implementação do design Command
não está legal.
Veja que no código cada IComando
está executando a operação de cálculo:
public class MultiplyCommand : IComando
{
public int Executa(int x, int y)
{
return x * y;
}
}
Quando você faz return x * y;
, o próprio comando está tomando pra si o papel que seria da calculadora. Ou seja, se você der uma olhada, vai perceber que sua calculadora não está calculando nada, pois esse papel está sendo representado pelos comandos.
Então o que fazer? Você pode mudar os comandos para que eles 1) recebam no construtor uma instância da calculadora e do operando e 2) invoquem a operação desejada na classe Calculadora
("receiver" ou "receptor"):
public class MultiplyCommand : IComando
{
private readonly IReceptor calculadora;
private readonly int operando;
public MultiplyCommand (IReceptor calculadora, int operando)
{
this.calculadora = calculadora;
this.operando = operando;
}
public void Executa()
{
this.calculadora.Multiplica(this.operando);
}
}
Ou seja, é o comando que deve delegar a operação para a calculadora, e não o contrário.
E note que eu só armazenei um dos 2 operadores na classe MultiplyCommand
: isso porque estou pressupondo que o outro operando é o próprio valor atual da classe Calculadora
.