Programação Orientada a Objetos (DPADF...

20
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

Transcript of Programação Orientada a Objetos (DPADF...

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 ...

Salamandra

Movimento do Anfíbio

Quero-quero

Movimento da Ave

Dourado

Movimento do Peixe

Temos um vetor de Objetos.

Um método que recebe um

animal, mostra seu nome e o

movimenta

Antes de chamar o método,

os objetos são transformados

em Animais ...

Saída do código

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 JavaMé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 ...