Olá! Resolvi o exercício proposto de uma maneira diferente, Funcionou, Porém não sei se é uma boa prática no dia a dia realizar este procedimento.
Classe "Em Aprovação"
public class EmAprovacao : EstadoDeUmOrcamento
{
public void AplicaDescontoExtra(Orcamento orcamento)
{
orcamento.Valor -= orcamento.Valor * 0.05;
orcamento.EstadoAtual = new EmAprovacaoComDescontoDado();
}
public void Aprova(Orcamento orcamento)
{
orcamento.EstadoAtual = new Aprovado();
}
public void Finaliza(Orcamento orcamento)
{
throw new Exception("Orçamento em Aprovação não pode ser Finalizado diretamente!");
}
public void Reprova(Orcamento orcamento)
{
orcamento.EstadoAtual = new Reprovado();
}
}
Classe "Em aprovação com desconto dado"
public class EmAprovacaoComDescontoDado : EmAprovacao, EstadoDeUmOrcamento
{
public void AplicaDescontoExtra(Orcamento orcamento)
{
throw new Exception("Desconto Já Realizado nessa etapa");
}
public void Aprova(Orcamento orcamento)
{
base.Aprova(orcamento);
}
public void Finaliza(Orcamento orcamento)
{
base.Finaliza(orcamento);
}
public void Reprova(Orcamento orcamento)
{
base.Reprova(orcamento);
}
}
Desta Maneira eu consegui eliminar a condicional dentro do método AplicaDescontoExtra e lançar a Exceção como proposto. A Classe EmAprovacaoComDesconto estende de EmAprovacao para que em uma manutenção futura eu apenas altere as funções na classe Pai, também implementei a Interface EstadoDeUmOrcamento para poder linkar a referência na propriedade EstadoAtual da classe Orcamento. (Não entendi porque não consegui fazer esse "link" apenas herdando de EmAprovacao", já que ela implementa essa interface)
Com esse mesmo pensamento repliquei a solução para as classes Aprovado e AprovadoComDescontoDado.
Como disse anteriormente, não sei se essa foi uma boa prática, se houver alguma sugestão poderiam me ajudar a melhorar o código?
Agradeço desde já!