Professional Documents
Culture Documents
Introdução
Continuaremos nosso estudo de programação orientada a objetos explicando e demonstrando o
polimorfismo com hierarquias de herança. O polimorfismo permite “programar no geral” em vez de
“programar no específico”. Em particular, o polimorfismo
permite escrever programas que processam objetos que compartilham a mesma superclasse, direta ou
indiretamente, como se todos
fossem objetos da superclasse; isso pode simplificar a programação.
Considere o exemplo de polimorfismo a seguir. Suponha que criamos um programa que simula o
movimento de vários tipos de
animais para um estudo biológico. As classes Peixe, Anfíbio e Pássaro representam os três tipos de animais
sob investigação. Imagine que cada classe estende a superclasse Animal , que contém um método mover e
mantém a localização atual de um animal como
coordenadas x-y. Cada subclasse implementa o método mover. Nosso programa mantém um array Animal
que contém referências
a objetos das várias subclasses Animal . Para simular os movimentos dos animais, o programa envia a
mesma mensagem a cada
objeto uma vez por segundo — a saber, mover. Cada tipo específico de Animal responde a uma
mensagem mover de uma maneira
única — um Peixe poderia nadar um metro, um Anfíbio poderia pular um metro e meio e um Pássaro
poderia voar três metros.
Cada objeto sabe como modificar suas coordenadas x-y de forma adequada para seu tipo específico de
movimento. Contar com o fato
de que cada objeto sabe “fazer a coisa certa” (isto é, faz o que é apropriado a esse tipo de objeto) em
resposta à mesma chamada
de método é o conceito-chave do polimorfismo. A mesma mensagem (nesse caso, mover) enviada a
uma variedade de objetos tem
muitas formas de resultados — daí o termo polimorfismo.
Implementando para extensibilidade
Com o polimorfismo, podemos projetar e implementar sistemas que são facilmente extensíveis —
novas classes podem ser adicionadas com pouca ou nenhuma modificação a partes gerais do
programa, contanto que as novas classes façam parte da hierarquia
de herança que o programa processa genericamente. As novas classes simplesmente se “encaixam”.
As únicas partes de um programa
que devem ser alteradas são aquelas que exigem conhecimento direto das novas classes que
adicionamos à hierarquia. Por exemplo,
se estendermos a classe Animal para criar a classe Tartaruga (que poderia responder a uma mensagem mover
deslizando uma
polegada), precisaremos escrever somente a classe Tartaruga e a parte da simulação que instancia um
objeto Tartaruga. As partes
da simulação que dizem para que cada Animal se mova genericamente podem permanecer as mesmas.
Visão geral do capítulo
Primeiro, discutiremos os exemplos comuns do polimorfismo. Então, fornecemos um exemplo
simples que demonstra o comportamento polimórfico. Usamos referências de superclasse para
manipular tanto objetos de superclasse como objetos de subclasse
polimorficamente.
10.1 Introdução
10.2 Exemplos de polimorfismo
10.3 Demonstrando um comportamento polimórfico
10.4 Classes e métodos abstratos
10.5 Estudo de caso: sistema de folha de pagamento
utilizando polimorfismo
10.5.1 Superclasse abstrata Employee
10.5.2 Subclasse concreta SalariedEmployee
10.5.3 Subclasse concreta HourlyEmployee
10.5.4 Subclasse concreta CommissionEmployee
10.5.5 Subclasse concreta indireta
BasePlusCommissionEmployee
10.5.6 Processamento polimórfico, operador instanceof
e downcasting
10.6 Atribuições permitidas entre variáveis de
superclasse e subclasse
10.7 Métodos e classes final
10.8 Uma explicação mais profunda das questões com
chamada de métodos a partir de construtores
10.9 Criando e utilizando interfaces
10.9.1 Desenvolvendo uma hierarquia Payable
10.9.2 Interface Payable
10.9.3 Classe Invoice
10.9.4 Modificando a classe Employee para implementar a
interface Payable
10.9.5 Modificando a classe SalariedEmployee para
uso na hierarquia Payable
10.9.6 Usando a interface Payable para processar
Invoice e Employee polimorficamente
10.9.7 Algumas interfaces comuns da Java API
10.10 Melhorias na interface Java SE 8
10.10.1 Métodos de interface default
10.10.2 Métodos de interface static
10.10.3 Interfaces funcionais
10.11 (Opcional) Estudo de caso de GUIs e imagens
gráficas: desenhando com polimorfismo
10.12 Conclusão
Resumo | Exercícios de revisão | Respostas dos exercícios de revisão | Questões | Fazendo a diferença
0jhtp.indb 312 07/07/2016 15:19:18