Vous êtes sur la page 1sur 50

Prof.

Leonardo Barreto Campos 1


Polimorfismo
Prof. Leonardo Barreto Campos 2/50
Sumrio
Introduo;
Polimorfismo;
Polimorfismo Java;
Mtodos Abstratos Java
Classes Abstratas Java
Exerccio - Java
Polimorfismo C++
Classe Abstrata C++;
Funes Virtuais Puras C++
Classe-Base Virtual C++
Classes Amigas C++
Bibliografia;
Prof. Leonardo Barreto Campos 3/50
Introduo
A caracterstica de chamar mtodos de um objeto
sem especificar o tipo exato dele conhecido como
polimorfismo;
A palavra polimorfismo significa assumir vrias
formas.
O polimorfismo permite escrever programas que
processam objetos que compartilham a mesma
superclasse em uma hierarquia de classes como se
todas fossem objetos da superclasse;
Prof. Leonardo Barreto Campos 4/50
Polimorfismo
Exemplo:
Considere uma classe veculo com duas classes derivadas,
Automvel e Bicicleta.
Essas classes tm trs mtodos, definidos para veculos de forma
geral e redefinidos mais especificamente para automveis e
bicicletas;
Prof. Leonardo Barreto Campos 5/50
Polimorfismo
As funes so:
checkList(), para verificar o que precisa ser analisado no
veculo;
adjust(), para realizar os reparos e a manuteno
necessria;
cleanup(), para realizar procedimentos de limpeza do
veculo.
A aplicao Oficina define um objeto que recebe
objetos da classe Veculo.
Para cada veculo recebido, a oficina executa na seqncia os
trs mtodos da classe Veculo.
Prof. Leonardo Barreto Campos 6/50
Polimorfismo - Java
Prof. Leonardo Barreto Campos 7/50
Polimorfismo - Java
Prof. Leonardo Barreto Campos 8/50
Polimorfismo - Java
Prof. Leonardo Barreto Campos 9/50
Polimorfismo
- Java
No h como saber no
momento da programao
se a Oficina estar
recebendo um automvel
ou uma bicicleta -- assim,
o momento de deciso
sobre qual mtodo ser
aplicado s ocorrer
durante a execuo do
programa.
Prof. Leonardo Barreto Campos 10/50
Polimorfismo - Java
Prof. Leonardo Barreto Campos 11/50
Polimorfismo
Consideraes:
Upcasting
O mtodo Oficina.proximo() realiza uma atribuio de um
objeto Automvel varivel (referncia para objeto
Veiculo) v quando o valor do nmero aleatrio gerado par
(o resto da diviso inteira por 2 igual a 0). Essa
atribuio de um objeto de uma classe mais especializada
para uma referncia de uma classe ancestral denominada
upcast. Esse mesmo tipo de atribuio realizado de
Bicicleta para veculo quando o nmero aleatrio gerado
mpar.
Prof. Leonardo Barreto Campos 12/50
Polimorfismo
Consideraes:
Uso de mtodos abstratos
Apesar de mtodos da classe Veculo terem sido definidos,
estes nunca so invocados nesse exemplo. (Se fossem, algo
estaria errado.) Isso ilustra uma situao onde mtodos
abstratos poderiam ser utilizados, pois a definio do
corpo desses mtodos de fato irrelevante. Ainda mais, se
uma classe como essa s contm mtodos abstratos, ela
poderia ser implementada como uma interface Java.
Prof. Leonardo Barreto Campos 13/50
Classe Abstrata - Java
Conforme vimos em herana, uma classe abstrata
til quando no se quer instanciar objetos.
As superclasses abstratas so utilizadas para que
outras classes possam herdar e assim compartilhar um
projeto comum.
Em java, cria uma classe abstrata declarando-a com a
palavra-cahve abstract:
public abstract class Quadrilatero{
Prof. Leonardo Barreto Campos 14/50
Mtodos Abstratos - Java
Uma classe abstrata normalmente contm um ou mais
mtodos abstratos;
Um mtodo abstrato um com a palavra-chave
abstract na sua declarao, como em:
public abstract float calcularArea();
Mtodos abstratos no fornecem implementaes.
Uma classe que contm mtodos abstratos deve ser
declarada como classe abstrata esmo que contenha
mtodos concretos (no abstratos);
Prof. Leonardo Barreto Campos 15/50
Exerccio - Java
Exerccio:
1) Implemente, em Java, uma classe abstrata de nome
Quadrilatero onde so declarados dois mtodos abstratos:
float calcularArea();
float calcularPerimetro();
2) Crie, como subclasse de Quadrilatero, uma classe de nome
Retangulo cujas instncias so caracterizadas pelos atributos
lado e altura ambos do tipo float. Implemente na classe
Retangulo os mtodos herdados de Quadrilatero e outros que
ache necessrios.
Prof. Leonardo Barreto Campos 16/50
Exerccio - Java
Exerccio:
3) Crie, como subclasse de Quadrilatero, uma classe de nome
Circulo cujas instncias so caracterizadas pelo atributo raio
do tipo float. Implemente na classe Circulo os mtodos
herdados de Quadrilatero e outros que ache necessrios.
Nota: poder aceder ao valor de Pi fazendo Math.Pi.
4) Crie, como subclasse de Retangulo, uma classe de nome
Quadrado cujas instncias so caracterizadas por terem os
atributos lado e altura com o mesmo valor.
Prof. Leonardo Barreto Campos 17/50
Exerccio - Java
Exerccio:
5) Elabore um programa de teste onde declarado um array,
de dimenso 5, do tipo esttico Quadrilatero. Nesse array
devem ser guardadas instncias de Rectangulo, Circulo e
Quadrado seguindo uma ordem aleatria. Nota: para gerar
nmeros aleatrios crie primeiro uma instncia da classe
Random (presente na biblioteca java.util) e para extrair um
inteiro entre 0 e n efectue a evocao nextInt(n). Depois
implemente um ciclo que percorra o array evocando,
relativamente a cada um dos objetos guardados, os mtodos
calcularArea e calcularPerimetro.
Prof. Leonardo Barreto Campos 18/50
Exerccio - Java
Classe Quadriltero:
Prof. Leonardo Barreto Campos 19/50
Exerccio - Java
Continuao da Classe Quadriltero:
Prof. Leonardo Barreto Campos 20/50
Exerccio - Java
Classe Retangulo:
Prof. Leonardo Barreto Campos 21/50
Exerccio - Java
Classe Circulo:
Prof. Leonardo Barreto Campos 22/50
Exerccio - Java
Classe Quadrado:
Prof. Leonardo Barreto Campos 23/50
Exerccio - Java
Programa de Teste:
Prof. Leonardo Barreto Campos 24/50
Exerccio - Java
Sada no Console do programa anterior:
Prof. Leonardo Barreto Campos 25/50
Exerccio - Java
Prof. Leonardo Barreto Campos 26/50
Exerccio - Java
Consideraes:
Entenda porque imprime a mensagem dentro do construtor
Retangulo na criao de um objeto Quadrado;
Refaa o exemplo excluindo o quadriltero crculo e
inserindo os quadrilteros Trapzio e Losango;
Retire as leituras desnecessrias, por exemplo, altura e raio
para Quadrado;
Imprima os dados personalizados na apresentao dos
clculos, por exemplo, A rea do retngulo de altura x e
largura y : z;
Prof. Leonardo Barreto Campos 27/50
Classe Abstrata C++
Em C++, uma classe abstrata uma classe que define
uma funo virtual pura;
Mas o que uma funo virtual?
uma funo que impede a classe declarar qualquer objeto
dela;
Em C++, o polimorfismo possvel atravs de funes
virtuais, vejamos como:
Prof. Leonardo Barreto Campos 28/50
Polimorfismo C++
virtual palavra-chave includa no
incio da declarao do mtodo
Classe derivada que implementa o
mtodo Print() novamente
Prof. Leonardo Barreto Campos 29/50
Polimorfismo C++
Demais classes derivadas que
tambm implementam o mtodo
Print() novamente
Prof. Leonardo Barreto Campos 30/50
Polimorfismo C++
Matriz de ponteiros para a classe Base
Objetos das classes Derivadas
Ponteiros recebendo os endereos de
cada um dos elementos objetos
Execuo da funo Print() dependendo
do contedo de p[i] e no do seu tipo
Prof. Leonardo Barreto Campos 31/50
Polimorfismo C++
Sada no console do programa anterior:
Prof. Leonardo Barreto Campos 32/50
Polimorfismo C++
Caso retirssemos a palavra-chave virtual da funo
Print() o compilador iria ignorar o contedo de p[i]
e usa o tipo do ponteiro para identificar o mtodo a
ser chamado, vejamos:
Prof. Leonardo Barreto Campos 33/50
Funes Virtuais Puras C++
Faz sentido termos um mtodo virtual com corpo?
No!!!
Dessa forma, temos a funo virtual pura que no tem
bloco de cdigo;
Para criar uma funo virtual pura basta usar o
operador de atribuio seguido de um zero aps o seu
prottipo:
Prof. Leonardo Barreto Campos 34/50
Exerccio C++
Exerccio:
1) Implemente, em C++, uma classe abstrata de nome Paciente
com um atributo char Nome[40] e dois mtodos:
void GetNome()
void Print()
2) Crie um classe derivada de Paciente de nome Assegurado:
cujas instncias so caracterizadas pelos atributos char
Seguradora[40] e int NumSeguro;
Implemente na classe Assegurado o mtodo Print()
herdado de Paciente e GetSeguro() para obter os
atributos (dados) da classe;
Prof. Leonardo Barreto Campos 35/50
Exerccio C++
Exerccio:
3) Crie um classe derivada de Paciente de nome NaoAssegurado:
cujas instncias so caracterizadas pelos atributos float
Consulta, int Banco e int Cheque;
Implemente na classe NaoAssegurado o mtodo Print() herdado
de Paciente e GetValor() para obter os atributos (dados) da
classe;
4) Elabore um programa de teste onde declarado um array, de
dimenso 100, do tipo Paciente. Nesse array devem ser guardadas
instncias de Assegurado e NaoAssegurado a partir de uma seleo
inicial (if). Aps o usurio optar em no incluir mais pacientes, o
programa de teste deve imprimir a relao de pacientes cadastrados;
Prof. Leonardo Barreto Campos 36/50
Exerccio - C++
Prof. Leonardo Barreto Campos 37/50
Exerccio - C++
Prof. Leonardo Barreto Campos 38/50
Exerccio - C++
Prof. Leonardo Barreto Campos 39/50
Exerccio
C++
Prof. Leonardo Barreto Campos 40/50
Classe-Base Virtual
Alm de declararmos funes virtuais, podemos usar a
palavra-chave virtual para declarar uma classe
inteira;
Base Pai
Derivada1
Filho1
Derivada2
Filho2
SuperDerivada
Neto
Prof. Leonardo Barreto Campos 41/50
Classe-Base Virtual
O trecho do programa seguinte mostra o erro de
ambigidade caso a palavra-chave virtual no seja
usada:
Prof. Leonardo Barreto Campos 42/50
Classe-Base Virtual
A soluo simples e evita o erro de ambigidade,
vejamos:
Prof. Leonardo Barreto Campos 43/50
Classes Amigas
Alm de ser possvel declararmos funes
independentes como amigas, podemos declarar uma
classe inteira como amiga da outra;
Nesse caso, os mtodos da classe ser todos amigos
da outra classe;
Ou seja, os mtodos tero acesso parte privada ou
protegida da outra classe.
Prof. Leonardo Barreto Campos 44/50
Classes Amigas
Vejamos um exemplo de classes amigas (Tempo e
Data):
Prof. Leonardo Barreto Campos 45/50
Classes Amigas
Vejamos a classe Data:
Acesso dados privados da classe Tempo.
Prof. Leonardo Barreto Campos 46/50
Classes Amigas
Continuao
da classe
Data:
Prof. Leonardo Barreto Campos 47/50
Classes Amigas
Programa teste:
Sada no Console:
Prof. Leonardo Barreto Campos 48/50
Aprenda Java com o BOPE
Prof. Leonardo Barreto Campos 49/50
Aprenda
Java com
o BOPE
Prof. Leonardo Barreto Campos 50/50
Bibliografia
Mizrahi, Victorine Viviane. Treinamento em C++,
mdulo 2. 2 ed. So Paulo: 2006.
Deitel, H. M. & Deitel, P. J. C++: como programar,
Editora Bookman. 3 ed. Porto Alegre: 2001.
Deitel, H. M. & Deitel, P. J. Java: como programar,
Editora Bookman. 6 ed. So Paulo: 2005.

Vous aimerez peut-être aussi