12
Programação Orientada a Objetos I Profª Tatiana P. Filgueiras A. Polimorfismo A palavra polimorfismo vem do grego e significa “que pode tomar várias formas”. Esta característica é um dos conceitos essenciais da programação orientada para o objeto. Enquanto que a herança se refere às classes (e à sua hierarquia), o polimorfismo diz respeito aos métodos 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 bancária. A palavra “abrir” pode ser aplicada a muitos objetos do mundo real, sendo que cada objeto interpreta ‘abrir’ de sua própria maneira. Porém, você pode simplesmente dizer ‘abrir’, para descrever a ação. Uma linguagem polimórfica é a que suporta polimorfismo (Actionscript, Java), já a linguagem monomórfica não suporta polimorfismo (Pascal, ASP). O polimorfismo pode ser do tipo Ad-Hoc (Sobrecarga (overloading) ou Coerção/Sobreposição (overriding)) ou Universal (Inclusão ou Paramétrico (template)). 1. Exemplo Polimorfismo Ad-Hoc Coerção Suponha o exemplo mencionado anteriormente, onde vários objetos podem “abrir” de maneiras diferentes. Uma possível implementação para a ação “abrir” seria a seguinte: Abrir.java public class Abrir{ public Abrir(){} public String comportamento(){ return "Estou abrindo: "; } public void imprimirAcao(){ System.out.println(comportamento()); } }

Polimorfismo V2

Embed Size (px)

DESCRIPTION

Descrição breve sobre polimorfismo em JAVA

Citation preview

  • 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. acaoAbrir = cc; 11. 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 Navio.java

    public class Aviao extends Brinquedo{ 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. O mesmo ocorre quando

    controleRemoto invocado com um objeto da classe Navio.

    Navio Titanic = new Navio();

    controle = new controleRemoto(Titanic);

  • 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 pr-

    definido 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 das possveis

    implementaes para esta classe:

    PardeElementos.java public class PardeElementos{

    public qualquerTipo primeiroElemento;

    public qualquerTipo segundoElemento;

    public PardeElementos(qualquerTipo primeiroElemento,

    qualquerTipo segundoElemento)

    {

    this.primeiroElemento = primeiroElemento;

    this.segundoElemento = segundoElemento; } }

  • 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

    Note que a classe PardeElementos foi definida da seguinte maneira:

    public class PardeElementos{...}

    Poderamos ter a declarado simplesmente assim:

    public class PardeElementos{...}

    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 palavras =

    new PardeElementos("Ana", "Jos");

    System.out.println(palavras.primeiroElemento);

    System.out.println(palavras.segundoElemento);

    PardeElementos numeros =

    new PardeElementos(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!