15.2. Verificação estática de tipos

Também seria bom poder guardar numa mesma coleção, por exemplo um array, jogos de vários tipos e invocar sobre esses jogos os métodos que estão acessíveis a todos, ou seja, os métodos definidos na classe Jogo:

O output deste programa é:

O array meusJogos é polimórfico pois contém elementos de diferentes tipos, embora ambos subtipos de Jogo.

 

Durante a compilação, como já sabemos, todas as atribuições e passagens de parâmetro são verificadas pelo compilador relativamente à correção dos tipos.

As atribuições

estão corretas do ponto de vista das regras que o compilador aplica (relembrar secção anterior), pois atribuem a cada uma das duas variáveis do tipo JogomeusJogos[0] e meusJogos[1] – valores de um subtipo de Jogo.

 

De igual modo, as invocações de métodos também são verificadas relativamente à correção dos tipos.

A regra que temos usado:

tem que ser refinada a partir do momento em que temos variáveis polimórficas.

Nestes casos podemos distinguir entre:

 

O compilador permite a invocação de um método m sobre um objeto o:

Logo, todas as invocações do programa ExemploPolimorfismoArray estão corretas, pois todos os métodos invocados sobre meusJogos[0] e meusJogos[1] são métodos acessíveis no tipo Jogo, que é precisamente o tipo declarado dessas duas variáveis.

As seguintes invocações, pelo contrário, seriam rejeitadas pelo compilador:

Embora o tipo concreto de meusJogos[0] seja JogoComObjetivo, que define o método pontuacaoObjetivo(), no entanto esta invocação está incorreta do ponto de vista dos tipos, pois o tipo de meusJogos[0] é Jogo. O mesmo se passa com a segunda instrução, desta vez em relação ao tipo JogoNumeroExatoJogadas.

De igual modo, no exemplo da secção anterior, em nenhum dos métodos imprimeVencedores(Jogo j) e imprimeDetalhes(Jogo j), se poderiam invocar, sobre o parâmetro j, métodos que não estivessem definidos em Jogo.

 

 

 


 

Anterior: 15.1. Polimorfismo

Seguinte: 15.3. Ligação dinâmica