14.6. Redefinição de métodos

Na classe Jogo apresentada no início deste capítulo, deixámos o método terminou em aberto (mais adiante lá voltaremos), ou seja, considerámos que não há nenhum critério de terminação que seja comum à maior parte dos jogos.

O método vencedores, pelo contrário, foi implementado de modo a devolver o(s) jogador(s) com melhor pontuação. Ou seja, considerámos que este critério – melhor pontuação – é suficientemente geral para se aplicar à maior parte dos jogos. Há vários tipos de jogos em que o vencedor é o que tem maior pontuação, nomeadamente os jogos que terminam ao fim de um dado número de jogadas, ou ao fim de determinado tempo, etc.

Por acaso (ou de propósito, na verdade) não é isso que acontece no JogoComObjetivo. Neste tipo de jogo queremos que seja vencedor todo e qualquer jogador que tenha alcançado a pontuação objetivo.

Mas se já temos uma implementação do método vencedores herdada da classe Jogo, como vamos fazer isso?

 

Uma primeira tentativa (que não está correta):

Perguntar a cada jogador qual a sua pontuação e compará-la com o objetivo:

Qual é o problema com esta solução?

 

Segunda tentativa (agora sim!):

Repare que na classe Jogo temos um método que nos pode ser muito útil – o método pontuacaoSuperiorA – que, dado um inteiro, devolve os nomes dos jogadores cuja pontuação é superior a esse inteiro.

Então, podemos usar este método para obter os nomes dos nossos vencedores! Basta invocá-lo, a partir do método vencedores, usando o valor da pontuação objetivo -1 como limite inferior:

Vamos agora considerar este main:

Ao executá-lo, iremos obter o seguinte output:

Se tivesse sido executada a versão de vencedores implementada na classe Jogo o resultado daria diferente – só o Pedro seria vencedor.

 

Regras na redefinição de métodos em subclasses:

Seja m um método definido numa classe A. Seja B uma subclasse de A. Seguem-se algumas restrições à redefinição de m em B:

Repare na anotação @Override na linha imediatamente acima da assinatura do método vencedores: esta anotação informa o compilador que a intenção é que aquele método redefina o correspondente método na superclasse.

Embora não seja obrigatória, esta anotação é extremamente útil. Se por alguma razão o método correspondente na superclasse muda – o nome, a lista de parâmetros, etc –, deixa de haver redefinição. Nesse caso o compilador avisa-nos que a subclasse está ilegal pois aquele método devia ser redefinição de algum existente na superclasse e não é o que acontece.

 

A classe JogoComObjetivo completa:

 

 


 

Anterior: 14.5. Invocação de métodos herdados

Seguinte: 14.7. Outra subclasse de Jogo