Opinião do Instrutor no exercicio é que podemos fazer com que o próximo ítem da corrente seja opcional (ou seja, o atributo outraResposta fica com null caso não haja um próximo ítem). E, no momento de invocar o próximo, você deve verificar se esse atributo é nulo ou não.
Contudo no exemplo que ele dá, o proximo item é obrigatório quando você está instanciando um objeto:
class RespostaEmPorcento implements Resposta {
private $outraReposta;
function __construct(Resposta $outraResposta) {
$this->outraResposta = $outraResposta;
}
public function RespostaEmPorcento() {
$this->outraResposta = null; // nao recebi a proxima!
}
public function responde(Requisicao $req, Conta $conta) {
if($req->getFormato() == Formato::PORCENTO) {
echo $conta->getTitular() . '%' . $conta->getSaldo();
} else if(!is_null($outraResposta)){
$outraResposta->responde($req, $conta);
} else {
// não existe próxima na corrente, e ninguém atendeu a requisição!
// poderíamos não ter feito nada aqui, caso não fosse necessário!
throw new Exception("Formato de resposta não encontrado");
}
}
}
Notem que no construtor é esperado um objeto do tipo Resposta. Neste caso não seria interessante criar uma nova classe apenas para tratar este erro?
class RespostaNaoEncontrada implements Resposta {
public function __construct(){}
public function responde(Requisicao $req, Conta $conta)
{
throw new Exception("Formato de resposta inexistente");
}
}