Sei sulla pagina 1di 12

Programao Orientada a Objetos I

Prof Tatiana P. Filgueiras

A. Polimorfismo
A palavra polimorfismo vem do grego e significa que pode tomar vrias
formas. Esta caracterstica um dos conceitos essenciais da programao
orientada para o objeto. Enquanto que a herana se refere s classes (e sua
hierarquia), o polimorfismo diz respeito aos mtodos dos objetos.
Pensando mais em objetos e funcionalidades, pense agora no termo abrir,
por exemplo. Voc pode abrir uma porta, uma caixa, uma janela e uma
conta bancria. A palavra abrir pode ser aplicada a muitos objetos do mundo
real, sendo que cada objeto interpreta abrir de sua prpria maneira.
Porm, voc pode simplesmente dizer abrir, para descrever a ao.
Uma linguagem polimrfica a que suporta polimorfismo (Actionscript, Java),
j a linguagem monomrfica no suporta polimorfismo (Pascal, ASP). O
polimorfismo pode ser do tipo

Ad-Hoc (Sobrecarga

(overloading) ou

Coero/Sobreposio (overriding)) ou Universal (Incluso ou Paramtrico


(template)).

1. Exemplo Polimorfismo Ad-Hoc Coero


Suponha o exemplo mencionado anteriormente, onde vrios objetos podem
abrir de maneiras diferentes. Uma possvel implementao para a ao abrir
seria a seguinte:
Abrir.java
public class Abrir{
public Abrir(){}
public String comportamento(){
return "Estou abrindo: ";
}
public void imprimirAcao(){
System.out.println(comportamento());
}
}

Na classe apresentada, temos dois mtodos: comportamento e imprimirAcao.


O mtodo comportamento retorna que tipo de comportamento a classe est
executando, ou seja, o que a classe est fazendo. O mtodo imprimirAcao
imprime em tela o comportamento, para podermos ver o polimorfismo em ao.
Agora suponhamos que temos dois objetos: uma Janela e uma Conta
Bancria. Como dito anteriormente, os dois objetos podem abrir, porm, de
maneiras diferentes. Como atribuir o comportamento de Abrir para cada um
desses objetos? Suponhamos que Janela e ContaBancaria sejam as classes a
seguir:
Janela.java
public class Janela extends Abrir{
public Janela(){ }
public String comportamento(){
return "Uma janela";
}
}
contaBancaria.java
public class contaBancaria extends Abrir{
public contaBancaria(){}
public String comportamento(){
return "Uma conta bancaria";
}
}

Observando as classes acima, ambas herdam a classe Abrir, porm, ambas


possuem seus prprios mtodos comportamento: cada um com caractersticas
prprias do objeto ao qual pertence. Mas como isso vai funcionar?
Implementando a classe Principal, podemos ver o resultado do polimorfismo:

Principal.java
public class Principal{
public static void main(String args[]){
Abrir acaoAbrir = new Abrir();
Janela j = new Janela();

contaBancaria cc = new contaBancaria();

acaoAbrir.imprimirAcao();
acaoAbrir = j;
acaoAbrir.imprimirAcao();
acaoAbrir = cc;
acaoAbrir.imprimirAcao();
}
}

Vamos analisar o cdigo da classe Principal:


4. Abrir acaoAbrir = new Abrir();
5. Janela j = new Janela();
6. contaBancaria cc = new contaBancaria();

Nas linhas acima, criamos trs objetos: um objeto que denominamos de


acaoAbrir do tipo Abrir (linha 4); um objeto que denominamos de j para a classe
Janela (linha 5), e um objeto que denominamos cc para a classe contaBancaria
(linha 6).
7. acaoAbrir.imprimirAcao();
8. acaoAbrir = j;
9. acaoAbrir.imprimirAcao();

Nas linhas acima, invocamos o mtodo imprimirAcao() contido na classe


abrir (linha 7). A partir da linha 8 que podemos verificar o polimorfismo. Note
que acaoAbrir objeto do tipo Abrir, porm, ao declararmos que acaoAbrir = j,
estamos declarando que Abrir = Janela, ou seja, todos os mtodos da classe
Abrir que estiverem declarados na classe Janela sero sobrescritos , e os que
no estiverem, permanecero. Isso denominado UPCASTING: quando um
objeto de uma instancia recebe a instancia de outro objeto. Esse a principal
caracterstica do polimorfismo Ad-Hoc Coero (ou Sobreposio).

10.
11.

acaoAbrir = cc;
acaoAbrir.imprimirAcao();

Pode-se perceber que o objeto acaoAbrir sofreu outra alterao. Agora, de


Janela ele passou a ser contaBancaria. Executando os cdigos apresentados,
temos a seguinte sada:

2. Exemplo Polimorfismo Ad-Hoc Sobrecarga


Denominamos sobrecarga quando o mesmo nome (de um mtodo ou
construtor) pode ser usado mais do que uma vez com diferentes tipos de
parmetros. Suponhamos a classe sobrecarga abaixo:
sobrecarga.java
public class sobrecarga{
public sobrecarga(){
System.out.println("Construtor sem parametros");
}
public sobrecarga(int x){
System.out.println("Construtor com 1 parametro x ="+x);
}
public sobrecarga(int x, String mensagem){
System.out.println("x ="+x+" e mensagem ="+mensagem);

}
public int soma(int n1, int
n2){ return n1+n2;
}
public String soma(double n1, double n2){ return
"O resultado da soma eh:"+(n1+n2);

}
}

A classe apresentada possui trs construtores: o primeiro, que no recebe


nenhum parmetro; o segundo, que recebe um inteiro como parmetro; e o
terceiro, que recebe um inteiro e uma String como parmetros; exemplificando
assim uma sobrecarga de construtores. Alm disso, a classe possui dois
mtodos com o mesmo nome: soma. A diferena entre esses mtodos que o
primeiro recebe dois inteiros como parmetro, e retorna um inteiro; enquanto o
segundo mtodo soma recebe dois parmetros do tipo Double e retorna uma
String; exemplificando assim uma sobrecarga de mtodos. Na sobrecarga,
vale ressaltar algumas observaes:
1. Dois mtodos com mesmo nome nunca podem ter os mesmos tipos de
parmetros, mesmo que retornem tipos diferentes,
a. Ex:
public int soma(int n1, int n2){
return n1+n2;
}
public String soma(int n1, int n2){
return "O resultado da soma eh:"+(n1+n2);
}
Sada: soma(int,int) is already defined in class sobrecarga

2. Porm, podem retornar o mesmo tipo, desde que os parmetros sejam


diferentes.
a. Ex:
public int soma(int n1, int n2){
return n1+n2;
}
public int soma(double n1, double n2){
return 1;
}

3. Exemplo Polimorfismo Universal Incluso


Polimorfismo de incluso usa a capacidade de substituio da Herana, de
uma classe pai por qualquer classe filho, para permitir um comportamento
polimrfico nos mtodos que usam a classe pai, ou seja, uma funo definida
num determinado tipo pode tambm operar todos os seus subtipos. Resulta
diretamente do mecanismo de herana uma operao definida na classe
base tambm aplicvel aos objetos de todas as subclasses.
Para exemplificar, suponhamos dois tipos de brinquedo: um avio e um
navio. Os dois podem ser controlador por controle remoto. Em JAVA, criaremos
as classes Aviao e Navio, que herdaro a classe Brinquedo.
Brinquedo.java
public class Brinquedo{
public Brinquedo(){}

public void mover(){


System.out.println("Brinquedo se movendo");
}
public void buzina(){
System.out.println("FOOOOOOOMMMM!");
}
}
Aviao.java
public class Aviao extends Brinquedo{

Navio.java
public class Navio extends Brinquedo{

public Aviao(){}

public Navio(){}

public void mover(){

public void mover(){

System.out.println("VOAR");

System.out.println("NAVEGAR");

}
}

}
}

At aqui utilizamos apenas o conceito simples de herana. Para demonstrar


o polimorfismo de incluso, criaremos a classe controleRemoto e a classe
Principal.
controleRemoto.java

public class controleRemoto{


public Brinquedo brinquedo;

public controleRemoto(Brinquedo brinquedo){


this.brinquedo = brinquedo;
}
}
Principal.java
public class Principal{
public static void main(String args[]){
Aviao boeing = new Aviao();

controleRemoto controle = new controleRemoto(boeing);


controle.brinquedo.mover();
controle.brinquedo.buzina();
Navio Titanic = new Navio();
controle = new controleRemoto(Titanic);
controle.brinquedo.mover();
controle.brinquedo.buzina();
}
}

Note que a classe controleRemoto est diretamente ligada classe


Brinquedo, pois ela possui um objeto do tipo Brinquedo, porm, as classes
Aviao e Navio esto indiretamente ligadas a classe controleRemoto. Isso
observvel nas seguintes linhas:
controleRemoto.java
public controleRemoto(Brinquedo brinquedo){...}

Principal.java
Aviao boeing = new Aviao();
controleRemoto controle = new controleRemoto(boeing);
Observe que o construtor da classe controleRemoto espera receber um
objeto do tipo Brinquedo, porm, a classe Principal envia para este construtor
um objeto do tipo Aviao. No ocorre nenhum erro, pois Aviao classe filha de
Brinquedo, ento, ao ter um objeto do tipo Brinquedo, a classe controleRemoto
passa a ter a capacidade de receber tanto objetos do tipo Brinquedo como
objetos

das

classes

filho

de

Brinquedo.

mesmo

controleRemoto invocado com um objeto da classe Navio.


Navio Titanic = new Navio();
controle = new controleRemoto(Titanic);

ocorre

quando

4. Exemplo Polimorfismo Universal Paramtrico


Polimorfismo paramtrico o polimorfismo aplicado a parmetros. Podemos
definir uma classe que receba um parmetro de qualquer tipo e trate este
parmetro de forma adequada. Um exemplo desse tipo de polimorfismo em
Java a definio de vetores e matrizes (arrays). O tipo array um tipo prdefinido de Java, assim como os tipos int e char. Um objeto de tipo array possui
um conjunto de operaes caractersticas, tais como:
x.length - obtm o nmero m de elementos armazenados em x;

x[int i] - obtm o endereo do i-simo elemento armazenado em x.

A implementao dessas operaes, porm, depende do tipo de valor


armazenado no array.
Para exemplificar de maneira genrica, vamos criar nossa prpria classe
com polimorfismo paramtrico. Suponhamos uma pequena lista de apenas
dois elementos, que denominaremos de PardeElementos. Esta lista pode
receber desde String, Integer, Double... enfim, qualquer tipo que no
previamente

conhecido.

Abaixo

se

encontra

uma

implementaes para esta classe:


PardeElementos.java
public class PardeElementos<qualquerTipo>{

public qualquerTipo primeiroElemento;


public qualquerTipo segundoElemento;

public PardeElementos(qualquerTipo primeiroElemento,


qualquerTipo segundoElemento)
{
this.primeiroElemento = primeiroElemento;
this.segundoElemento = segundoElemento;
}
}

das

possveis

O primeiro passo para definio de uma classe polimrfica paramtrica


incluir em sua definio que a mesma ir tratar tipos desconhecidos
previamente. Fazemos isso por definir a classe da seguinte maneira:
public class nome_da_classe<nome_qualquer_para_o_Tipo>
Note que a classe PardeElementos foi definida da seguinte maneira:
public class PardeElementos<qualquerTipo>{...}
Poderamos ter a declarado simplesmente assim:
public class PardeElementos<T>{...}
Ou seja, o nome do tipo que a classe ir receber pode ser qualquer um.
O prximo passo atribuir quais elementos (atributos e/ou mtodos) sero
do tipo desconhecido. No caso da classe apresentada, declaramos os
seguintes atributos:
public qualquerTipo primeiroElemento;
public qualquerTipo segundoElemento;
Caso venhamos a implementar mtodos ou construtores que utilizem estes
atributos, os mesmos devem seguir o princpio da atribuio de tipos. Por
exemplo, vejamos o construtor da classe PardeElementos:
public PardeElementos(qualquerTipo primeiroElemento,
qualquerTipo segundoElemento{...}
O construtor recebe dois elementos de tipos desconhecidos. Caso
construssemos um mtodo que retornasse um tipo desconhecido, este mtodo
teria que seguir a seguinte sintaxe:
public qualquerTipo getPrimeiroElemento(){
return primeiroElemento;
}
O mtodo acima exemplo de um mtodo que retorna o valor do atributo
primeiroElemento.

Para testarmos nossa classe polimrfica paramtrica, usaremos a classe


Principal abaixo:
Principal.java

public class Principal{


public static void main(String args[]){
PardeElementos<String> palavras =
new PardeElementos<String>("Ana", "Jos");
System.out.println(palavras.primeiroElemento);
System.out.println(palavras.segundoElemento);
PardeElementos<Integer> numeros =
new PardeElementos<Integer>(1,2);
System.out.println(numeros.primeiroElemento);
System.out.println(numeros.segundoElemento);

}
}

Observando a classe Principal, podemos notar que os objetos da classe


PardeElementos foram instanciados com tipos diferentes: o objeto palavras
com o tipo String e o objeto numeros com o tipo Integer.

B. Exerccios de Fixao
1. Sem consultar o material, responda: o que voc entendeu por
polimorfismo?
2. Quais so os tipos de polimorfismo?
3. Crie uma classe Produto, que seja superclasse das classes DVD e
Televisor. A classe Produto deve possuir como atributos nome e
IdentificadorNumerico, e como mtodo mostrarDados(). A classe
Televisor deve ter como atributo marca e como mtodo mostrarDados().
A classe DVD deve ter como atributos ttulo e preo e como mtodo
mostrarDados(). O mtodo mostrarDados() para cada uma das classes
deve imprimir em tela uma mensagem diferente. Sugere-se que, para
cada classe, a impresso em tela indique em que classe est sendo
executado o mtodo. Ex.: para a classe DVD, o mtodo pode imprimir:
Sou da classe DVD.
4. Crie uma classe principal que teste o polimorfismo do exerccio 3.
5. Responda: Que tipo de polimorfismo foi usado no exerccio 4?
6. Modifique a classe Produto de forma que utilize polimorfismo Ad-Hoc
Sobrecarga.
7. Crie uma classe cadastroProdutos que tenha como atributo um objeto do
tipo Produto e como mtodo mostrarDadosdoProduto(). O mtodo
mostrarDadosdoProduto() deve invocar o mtodo mostrarDados() do
atributo do tipo Produto.
8. Modifique a classe Principal, de forma que utilize Polimorfismo Universal
Incluso utilizando a classe criada no exerccio 7.
9. Transcreva as duas classes apresentadas na seo de Polimorfismo
Paramtrico e execute-as para testar sua funcionalidade.
10. Modifique o exerccio da disciplina de estrutura de dados (Lista Ligada
ou Duplamente Ligada) de tal forma que a lista utilize Polimorfismo
Paramtrico, e assim, possa receber dados de qualquer tipo.
Os exerccios devem ser enviados via moodle. No se esquecer de inserir o
nome da dupla no arquivo zipado!

Potrebbero piacerti anche