14.8. Ainda a redefinição de métodos

No método registarPontosJogada não basta fazer as duas tarefas que foram descritas; é necessário também registar os pontos no jogador a quem a jogada respeita. Ou seja, teríamos que ter também a instrução:

Mas temos um problema! O método obterJogador, definido na classe Jogo, é private, ou seja, o compilador não aceitaria esta instrução na classe JogoNumeroExatoJogadas.

A solução seria invocar o próprio método registarPontosJogada implementado na classe Jogo, que é public, sobre o objeto corrente, obtendo algo como:

Mas não é isto que nós queremos! Desta forma estaríamos a invocar o próprio método registarPontosJogada implementado na subclasse, – através de recursão –, obtendo, neste caso em particular, um processo que não termina.

 

O que nós queremos mesmo é executar o corpo do método registarPontosJogada, tal como definido na superclasse, sobre o objeto corrente. A forma como indicamos isso ao compilador é usando a palavra super em vez de this, para referir o objeto corrente.

Na redefinição de um método m, numa classe B, podemos invocar a versão de m definida na superclasse de B sobre o objeto corrente, referindo-nos a ele através da palavra super.

 

Finalmente, a versão correta:

Repare que fizemos o mesmo na redefinição do método toString. A representação textual de um objeto do tipo JogoNumeroExatoJogadas inclui não só os valores dos novos atributos definidos nesta subclasse, mas também os valores dos atributos definidos na classe Jogo.

A única maneira de conseguirmos aceder, a partir do método na subclasse, aos valores de todos os atributos definidos na superclasse, é através da invocação do método toString tal como definido na classe Jogo, acrescentando de seguida a informação adicionada pela subclasse.

 

Vamos agora considerar este novo main:

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

 

Como queremos que os vencedores deste novo tipo de jogo sejam calculados tal como na classe Jogo, então não precisamos de redefinir o método vencedores; pelo facto desta classe ser subclasse de Jogo, o método vencedores da classe Jogo é herdado tal e qual como implementado nessa classe.

 

 


 

Anterior: 14.7. Outra subclasse de Jogo

Seguinte: 14.9. Redefinição versus atributos