Suponhamos agora que queremos ter um método, acessível a qualquer tipo de jogo, que devolva os nomes dos jogadores do jogo. Mas queremos que este resultado seja:
Uma implementação deste método poderia ser:
x/**
* Metodo template (ou implementacao esqueleto)
* Os nomes dos jogadores registados ou que teem pontuacao > 0
* @return Os jogadores que registados se este jogo ainda
* nao terminou
* Os nomes dos jogadores com pontuacao > 0 se este
* jogo jah terminou
*/
private List<String> jogadores () {
ArrayList<String> result = new ArrayList<String>();
for (Jogador jog : this.jogadores) {
if(this.terminou()) {
if (jog.pontuacao() > 0) {
result.add(jog.nome());
}
} else {
result.add(jog.nome());
}
}
return result;
}
Em que classe devemos incluir este método? Se queremos que todos os subtipos de Jogo
tenham exatamente este método, devemos inclui-lo na classe Jogo, para que seja herdado por todas as suas subclasses.
Mas na instrução if(this.terminou())
invocamos o método terminou()
que é abstract
na classe Jogo
! Não há problema:
terminou
está declarado na classe Jogo
como abstract,Jogo
têm que implementar este método (se não o fizerem, terão que ser declaradas como abstract);terminou()
dentro de um método da classe Jogo
.
Diz-se que este é um método template ou implementação esqueleto
Anterior: 16.1. A classe abstrata Jogo