Olá Jõao,
Na verdade no texto quando o instrutor falou "Com o setter do Proxima na interface, garantimos que toda implementação saberá lidar com uma próxima resposta" ele estava se referindo justamente a implementação anterior na qual a interface resposta tinha o setter, no caso
interface Resposta
{
void Responde(Requisicao req, Conta conta);
Resposta Proxima { get; set; }
}
Ele comenta que a grande vantagem desta implementação é que a interface deste jeito força para que todas as classes que a implementam tenham a propriedade Proxima e seu setter. Porém, a desvantagem desta implementação é toda vez que o programador usar uma classe de Resposta
, como a RespostaEmXml
, ele precisa lembrar que antes de chamar o método Responde
ele precisa settar uma Proxima. Mas nada neste código ajuda ou força ele a lembrar de fazer isto.
Um outro jeito de implementar este código é retirar da interface a propriedade Proxima e em cada classe criar um construtor que recebe a Proxima (ou OutraResposta como está na solução), que ficaria assim:
interface Resposta
{
void Responde(Requisicao req, Conta conta);
}
class RespostaEmXml : Resposta
{
public Resposta OutraReposta { get; private set; }
public RespostaEmXml(Resposta outraResposta)
{
this.OutraResposta = outraResposta;
}
public void Responde(Requisicao req, Conta conta)
{
if(req.Formato == Formato.XML) {
Console.WriteLine("<conta><titular>" + conta.Titular + "</titular><saldo>" + conta.Saldo + "</saldo></conta>");
}
else
{
outraResposta.Responde(req, conta);
}
}
}
A vantagem desta solução é que o construtor agora força na hora que o programador vai instanciar a RespostaEmXml
ele já tem que fornecer a próxima. Ou seja, ele não precisa ficar lembrando de chamar um setter. No entanto, a desvantagem desta solução é que como a interface perdeu a propriedade e o setter, as classes que implementa Resposta
agora não são forçadas a ter uma proxima resposta. Cabe ao programador lembrar de colocar esta informação nestas classes.
Então o grande barato deste exercício e que o instrutor quis passar é que você tem várias formas de resolver este problema, cada uma das soluções tem suas vantagens e desvantagens.