Aula 6 - Polimorfismo - Colégio Agrícola de Frederico Westphalen

Propaganda
Programação Orientada a Objetos
(DPADF 0063)
Aula 6 – Polimorfismo
Universidade Federal de Santa Maria
Colégio Agrícola de Frederico Westphalen
Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno
Muitas formas
Polimorfismo
• É o princípio pelo qual duas ou mais classes
derivadas de uma mesma superclasse podem
invocar métodos que têm a mesma assinatura,
mas com comportamentos distintos ...
especializados para cada subclasse.
• O polimorfismo permite “programar no geral”
em vez de “programar no específico”.
Polimorfismo em prática ...
continua ...
Polimorfismo em prática ... (cont.)
Temos um vetor de Animais.
Os elementos do vetor são
instanciados com
subclasses de animas.
O método mover() é chamado para
cada elemento do vetor.
Qual método mover() vai ser chamado? O método da classe Animal ou os
métodos especializados de cada uma das subclasses?
Polimorfismo (cont.)
• A decisão sobre qual método sobrescrito deve ser
selecionado (dentro da hierarquia de classes) é
tomada em tempo de execução, considerando a classe
da instância (objeto) que o está chamando.
• O polimorfismo permite codificar programas que
processam objetos que compartilham a mesma
superclasse como se todos eles fossem objetos
daquela superclasse (simplificando a programação).
Polimorfismo (cont.)
• Com o polimorfismo, podemos projetar e implementar
sistemas facilmente extensíveis ... novas classes podem ser
adicionadas com pouca ou nenhuma modificação nas partes
gerais do programa ... desde que as novas classes façam
parte da hierarquia de herança já existente.
Retângulo, círculo e triângulo são
formas geométricas que podem
ser desenhadas
Com o polimorfismo o método desenhar() de cada subclasse
pode ser sobrescrito para que se comporte de maneira diferente.
Um programa que faz desenhos e que utiliza formas
geométricas não precisa se preocupar em chamar
métodos específicos de cada forma ... basta chamar o
método desenhar() da hierarquia ... se a subclasse
for um círculo ... seu método específico será chamado.
Casting ou Moldagem
• Utilizado para converter um objeto ou tipo primitivo de um
tipo/classe para outro;
• Suponhamos a necessidade de armazenar um valor int
dentro de um double ... como a precisão de um double
é maior ... a conversão é natural ...
int i = 3;
double pi = i + .14159;
• Quando há perda de precisão ... O casting é necessário ...
double pi = 3.14159;
int i = (int) pi; // Ao final i vale 3
Casting de Objetos
• Em aplicações que exploram o polimorfismo é comum a necessidade
de fazer com que um objeto se passe por outro.
• O casting não modifica o objeto, é o receptor do cast que constitui um
novo objeto ou um novo tipo ...
Temos um vetor de Objetos.
Um método que recebe um
animal, mostra seu nome e o
movimenta
Saída do código
Salamandra
Movimento do Anfíbio
Antes de chamar o método,
os objetos são transformados
em Animais ...
Quero-quero
Movimento da Ave
Dourado
Movimento do Peixe
Operador instanceof
• Utilizado para determinar o tipo de um objeto em tempo
de execução;
• Utilizado em situações onde alguma operação
específica de uma subclasse precisa ser chamada, mas
antes é necessário verificar se o objeto que vai chamar
o método é do tipo correto.
• Utilização: refObjeto instanceof nomeClasse
▫ Retorna um valor booleano (true ou false) indicando se o objeto
referenciado (refObjeto) é realmente uma instância da classe
(nomeClasse)
instanceof em prática ...
Se a instância for da classe
Peixe, então chama o
método nadar (o casting é
necessário para evitar um
erro de compilação).
Classes abstratas
• Uma classe abstrata é uma classe que não pode ser
instanciada ... não pode ser diretamente utilizada para
criar objetos;
• O propósito de criação de uma classe abstrata é de
fornecer uma superclasse apropriada para que outras
classes utilizem como base (herança);
• Seus métodos podem ter implementação ou podem ser
abstratos também (sem implementação).
Classes abstratas em Java
A palavra
reservada
abstract indica
que a classe é
abstrata e
portanto não pode
ser instanciada
diretamente
(precisa ser
herdada)
Métodos abstratos
• Uma classe abstrata pode conter métodos abstratos ...
ou seja ... métodos sem implementação na classe
abstrata que exigem a implementação nas subclasses
• A técnica de especificar métodos abstratos permite que
o projetista decida quais são os comportamentos que
as subclasses devem ter ... mas sem determinar como
tais comportamentos serão implementados ...
• Somente classes abstratas podem ter métodos
abstratos.
Métodos abstratos em Java
Métodos abstratos não podem ter
implementação na classe abstrata.
Nas subclasses
os métodos
abstratos
devem ser
obrigatoriamente
implementados.
Interfaces
• Uma interface é como se fosse uma classe 100% abstrata,
ou seja, uma coletânea de métodos sem implementação;
• Uma classe pode ter uma única superclasse (herança
simples), mas pode implementar várias interfaces ... através
deste recurso que Java consegue se utilizar dos benefícios
da herança múltipla;
• Uma interface um contrato que define um conjunto de
métodos públicos vazios que devem ser codificados nas
subclasses que implementarem a interface;
• Uma interface não pode definir métodos construtores.
Interfaces em Java
Classes Abstratas x Interfaces
• Ambos são projetos de classes que não podem ser instanciados;
• Uma interface é uma classe 100% abstrata (que não contém
nenhum método implementado, apenas assinaturas);
• Uma classe pode herdar uma única classe abstrata mas pode
implementar várias interfaces;
• Uma classe abstrata pode conter atributos de instância, já uma
interface pode conter apenas constantes estáticas;
• Em uma interface os métodos são implicitamente públicos e
abstratos.
• Ambas exigem a implementação dos métodos abstratos nas
subclasses;
Exercícios para fixação
Cardápio abstrato ...
• Codifique uma classe abstrata denominada de Receita ... ela deve
ter 2 métodos abstratos ... getIngredientes() e getModoDeFazer()
(de retorno String) e um atributo para indicar se a receita é de doce
ou de salgado. Codifique também 2 interfaces ... Cozido e Assado,
com um método para cozinhar e assar (respectivamente em cada
uma delas).
• Agora usando sua criatividade e seus dotes
culinários crie subclasses de Receita
implementando seus métodos abstratos. As
subclasses devem também utilizar uma ou
ambas interfaces especificadas.
• Para testar, faça uma classe Cardápio com um
vetor de receitas e invoque os métodos ...
Download