Polimorfismo de sobreposição e inclusão

download Polimorfismo de sobreposição e inclusão

of 13

Transcript of Polimorfismo de sobreposição e inclusão

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    1/13

    Escola Tcnica HelipolisTcnico em Informtica

    Gilson de Jesus AquinoTamires Merce

    Polimorfismo em Java:Sobrecarga, Sobreposio e Incluso.

    So Paulo

    2013

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    2/13

    POLIMORFISMO EM JAVA

    Agora que aprendemos os conceitos mais importantes e vimos o uso da Herana em

    Java, vamos estudar outras caractersticas marcantes da programao Java e, de uma

    maneira mais geral, da programao orientada a objetos: o polimorfismo.

    Com o polimorfismo vamos ter um controle maior sobre as subclasses sem ter que nos

    preocupar especificamente com cada uma delas, pois cada uma ter autonomia para agir

    de uma maneira diferente.

    Definio de polimorfismo em Java

    Traduzindo, do grego, ao p da letra, polimorfismo significa "muitas formas".

    Essas formas, em nosso contexto de programao, so as subclasses/objetos criados a

    partir de uma classe maior, mais geral, ou abstrata.

    Polimorfismo a capacidade que o Java nos d de controlar todas as formas de uma

    maneira mais simples e geral, sem ter que se preocupar com cada objeto

    especificamente.

    Mais uma vez, somente pela definio muito complicado de entender.

    Vamos partir para algo comum e de preocupao mxima de nosso curso de Java

    online: exemplos prticos.

    Exemplo 1 de Polimorfismo: Aumento no preo dos carrosVamos pra nossa loja de carros, onde voc o programador Java de l.

    Lembra que aprendeu, atravs de exemplos, a criar uma classe bem genrica, chamada

    "Carro"?

    E depois criamos vrias subclasses, de fuscas, ferraris, gols etc.

    Imagine que, todo ano, todos na empresa tem um aumento.

    A Ferrari teve aumento de 5%. o fusca ter aumento de 3% e o gol ter de 1%.

    Note que, embora todos sejam "Carro", cada objeto ter que calcular seu aumento deforma diferente, pois tero diferentes valores de aumento. Como criar, ento, um

    mtodo na superclasse que atenda todas essas necessidades diferentes?

    No na superclasse que se resolve, mas nas subclasses, criando o mtodo 'aumento()'

    em cada uma.

    Ou seja, vai criar vrios mtodos, e para fazer o aumento realmente ocorrer de maneira

    correta, s invocar o mtodo do objeto especfico.

    Ento: objetoFerrari.aumento() diferente de objetoFusca.aumento().

    Note que usamos o mesmo nome do mtodo para todas as subclasses, porm cada

    mtodo diferente um do outro.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    3/13

    Isso o polimorfismo em ao: embora todos os objetos sejam "Carro", eles tero uma

    forma diferente de agir, pois implementamos os mtodos de maneira diferente.

    Apenas invocamos, e todo objeto sabe exatamente o que fazer.

    Por isso o nome polimorfismo, pois cada objeto ter sua forma prpria de como rodar,

    pois os mtodos 'aumento()' dos objetos so diferentes.

    Outra vantagem do polimorfismo: voc j viu que, criando o mtodo aumento() em toda

    as subclasses, ela agiro de maneira independente da superclasse e diferente de outros

    objetos.

    Agora, quando chegar outro carro na sua loja voc de adicionar o mtodo aumento(), e

    ter um novo tipo de objeto, sem grandes alteraes no cdigo.

    Exemplo 2 de Polimorfismo: animais mugindo, latindo, berrando...

    Imagine que voc o criador do joguinho Colheita feliz ou Fazenda Feliz (sei l), onde

    ter vrios bichos nesse jogo.

    Como voc esperto, vai logo abstrair e criar uma classe "Animal" com as

    caractersticas que todos tem: idade, peso, espcie etc.

    Porm, nesse game, os animais fazem seu som caracterstico: o cachorro late, o gato

    mia, o pinto pia, a vaca muge etc.

    E a? Como criar um mtodo na superclasse que sirva para todos estes animais?

    Ora, no cria, pois cada animal age diferente nesse aspecto.

    Veja, polimorfismo isso: embora objetos sejam da mesma superclasse, vo agir de

    maneira diferente em algum aspecto. Ou seja, tero vrias(poli) formas diferentes

    (morfismo).

    A sada criar um mtodo chamado 'som()' na superclasse (s o cabealho, como

    veremos nos prximos tutoriais) e em cada subclasse criar um mtodo diferente, que

    caracterize cada bicho.

    Veja que se no fizssemos isso e invocssemos os mtodos: vaca.som(),

    cachorro.som(), gato.som(), todos iriam fazer o mesmo barulho.

    Com o polimorfismo: vaca.som() faria a vaquinha mugir, cachorro.som() faria o

    cachorro latir e gato.som() faria o objeto miar.

    Porm, todos continuam sendo, tambm, objetos da classe "Animal".

    E quando chegar mais animais na sua fazenda, adicione o mtodo som() nesse animal,

    de modo que ele poder agir conforme suas caractersticas.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    4/13

    Resumindo: polimorfismo permite que uma mesma superclasse possua subclasses com

    caractersticas - ou formas - diferentes.

    POLIMORFISMO DE SOBRECARGA

    Polimorfismo de sobrecarga permite que um mtodo de determinado nome tenha

    comportamentos distintos, em funo de diferentes parmetros (1) que ele recebe. Cada

    mtodo difere no nmero e no tipo de parmetros.

    Exemplo:

    Considere uma classe Maior capaz de calcular e retornar o maior entre dois nmeros de

    tipos diferentes. A Listagem 1 ilustra o cdigo de tal classe.(1) Lembrando: parmetros so as variveis que esto dentro dos parntesis na

    declarao do mtodo.

    Listagem 1 - Polimorfismo de Sobrecarga com tipos de parmetros diferentes

    Veja no exemplo uma aplicao prtica do uso do polimorfismo de sobrecarga. Observe

    que temos vrios mtodos com o mesmo nome, no caso calcMaior(), cujo objetivo

    indicar qual o maior dentre dois nmeros.

    O que diferencia cada um deles o tipo de parmetros. No primeiro mtodo, os

    parmetros so do tipo int. J no segundo mtodo, os dois parmetros so float.Finalmente, no terceiro mtodo, os parmetros so do tipo double. Esses mtodosfazem a mesma coisa (calculam o maior entre dois nmeros), mas de maneiras

    diferentes, pois recebem e retornam tipos diferentes.

    Observe agora o ltimo mtodo calcMaior() declarado na classe Maior. Esse mtodo,apesar de diferenciar do anterior pelo tipo de retorno de double para int, no ser aceito

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    5/13

    pelo compilador Java como um polimorfismo de sobrecarga.

    O motivo que j existe um mtodo com o nome calcMaior() e dois parmetros do

    tipo double. Esse mtodo seria aceito se houvesse um nmero diferente de parmetroou um dos parmetros tivesse o tipo diferente de double. Como mostra a Listagem 2.

    Listagem 2 - Polimorfismo de sobrecarga com tipo e nmero de parmetros diferentes

    Observe que agora os dois ltimos mtodos possuem nmero e tipos de parmetros

    diferentes dos mtodos anteriores.

    A SOBRECARGA E OS CONSTRUTORES

    O polimorfismo de sobrecarga normalmente acontece sobre os mtodos construtores,

    pois comum para uma classe ter vrias maneiras de instanci-la.

    A Listagem 3 ilustra um exemplo de polimorfismo de sobrecarga nos construtores da

    classe Pessoa. Observe que so declarados 3 construtores e todos eles tm o mesmo

    nome da classe. Entretanto, cada um deles recebe um nmero diferente de parmetros.

    Assim, durante a criao de objetos do tipo Pessoa em um mtodo main, por exemplo, oconstrutor que ser chamado ir depender da quantidade e parmetros passados durante

    a invocao do comando new.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    6/13

    Listagem 3 - Polimorfismo de sobrecarga de construtores

    A sobrecarga e a converso

    Converso e sobrecarga frequentemente andam lado a lado.

    A Converso a capacidade de um tipo ser convertido em outro tipo de maneiraautomtica ou pela fora bruta tambm chamada de coero.

    Veja o quadro abaixo sobre converso de tipos primitivos.

    Converso de Tipos Primitivos

    Java converte um tipo de dado em outro sempre que isso for apropriado.As converses ocorrem automaticamente quando h garantia de no haverperda de informao. As converses automticas so permitidas para tipos demaior preciso e para tipos de menor preciso.Exemplos de Converses Automticas

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    7/13

    So permitidas as converses do tipo byte para o tipo short, de short para int, eassim sucessivamente, at chegar o tipo de maior preciso, que o double.Observe tambm algumas converses permitidas baseadas nas variveis criadaspelas letras no quadro Algumas converses legais.

    A converso tambm pode fazer com que um mtodo parea como se fosse polimrfico.

    A converso ocorre quando um argumento de um tipo convertido para o tipo esperado,

    internamente. Por exemplo, suponha que a classe Maior, descrita anteriormente, tivesse

    apenas atributos e mtodos para lidar com o tipo primitivo, conforme ilustra a Listagem

    4.

    Listagem 4 - Classe Maior com o mtodo calcMaior para os tipos int e float

    Agora suponha que em uma aplicao (mtodo main) usamos um objeto da

    classe Maior, mas, na chamada de seu mtodo calcMaior, fossem passados, ao invs devalores do tipo float, valores do tipoint., conforme ilustra a Listagem 5.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    8/13

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    9/13

    Sobreposio de mtodos em uma hierarquia de Herana

    O que aconteceria se fosse solicitado ao Objeto1 da classeC a execuo do metodoX() ?

    Esse mtodo ser procurado na hierarquia da classe instanciada pelo Objeto1.

    Devemos observar que, nesse caso, o mtodoX() que tambm implementado na

    ClasseB, foi encontrado primeiro que o metodoX() da ClasseA.

    Nesse caso, o mtodo que de fato ser executado ser o da ClasseB.

    E nesse caso, o metodoX() da ClasseA jamais ser alcanado, a menos que seja criado

    um objeto da ClasseA. Dizemos ento que ocorreu uma sobreposio de mtodo ou um

    polimorfismo de sobreposio. O mtodoX da classeB sobreps (ou redefiniu) o mtodo

    de sua classe me.

    O POLIMORFISMO DE SOBREPOSIO EM JAVA

    Considere que a classe Brinquedo possui como descendentes as classes Carro, Avio e

    Barco, conforme ilustra a figura.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    10/13

    Hierarquia de Herana da classe Brinquedo

    Observe que as classes filhas sobrepem o mtodo mover() da classe Brinquedo.

    Considerando o mtodo mover() de cada classe filha, como poderamos chamar o

    mtodo mover() do brinquedo (classe) correto? Ou seja, como o ControleRemoto saber

    que mtodo mover ele deve chamar se ele tem disponvel trs tipos de mover diferentes

    (um para cada brinquedo)?

    Voc lembra que na primeira vez que apresentamos esse exemplo dissemos que a nica

    restrio para um controle remoto to verstil seria que quando criado o controleremoto, ele receberia o tipo de brinquedo que iria acionar em um dado instante?

    Pois , a que est o segredo para o controle remoto saber qual deve ser o mtodo

    mover() que ele deve chamar (CORRER, NAVEGAR ou VOAR). O mtodo construtor

    da classe ControleRemoto exige que o controle para ser inicializado receba um

    parmetro do tipoBrinquedo. E isso acontece quando o atributo brinquedo do

    ControleRemoto recebe b(um objeto do tipo Brinquedo).

    Ento, quando o mtodo mover() da classe ControleRemoto for acionado (isso significa

    dizer que o boto mover foi apertado), esse faz com que seu atributo brinquedo chame o

    mtodo mover()correto, dependendo do tipo de Brinquedo que recebeu quando foi

    instanciado.

    O exemplo abaixo mostra como fica a classe Principal que instancia um objeto

    controleRemoto e um objeto carro para ser controlado automaticamente.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    11/13

    Classe Principal com o mtodo main

    Observe que criamos um brinquedo do tipo Carro, e quando criamos o ControleRemoto,

    enviamos esse objeto carro para o objeto controleRemoto atravs da chamada ao seu

    construtor. Assim, quando acionado o comando controleRemoto.mover(), ser chamado

    o mtodo mover() do carro.

    O resultado ser a impresso da palavra:

    CORRER

    POLIMORFISMO DE INCLUSO

    Polimorfismo de incluso usa a capacidade de substituio da Herana, de uma classe

    me por qualquer classe descendente, para permitir um comportamento polimrfico nos

    mtodos que usam a classe me.

    No exemplo visto na seo anterior, veja a classe Principal na Listagem 8, onde criamos

    um objeto do tipo Carro e outro do tipo ControleRemoto, ns utilizamos o

    comportamento polimrfico do polimorfismo de incluso. Fizemos isso quando

    substitumos a classe Brinquedo (me) pela classe Carro (filha) dentro da classe

    ControleRemoto.

    Assim, o atributo interno do tipo Brinquedo da classe ControleRemoto pode receber

    qualquer objeto que seja de uma classe filha de Brinquedo. Para entender melhor o que

    aconteceu.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    12/13

    Hierarquia da Classe Brinquedo e da classe Controle Remoto

    Observe que a classe ControleRemoto est relacionada com a classe Brinquedo, pois

    possui um atributo do tipo Brinquedo. Mas, como as classes Carro, Avio e Barco so

    descendentes de Brinquedo, elas podem substituir a classe Brinquedo em qualquer

    mtodo que a utilize.

    Nesse caso, isso foi feito explicitamente, atravs da passagem de um objeto da classe

    Carro para o mtodo construtor de ControleRemoto na Classe Principal.

    Caso o programador deseje mudar o controle remoto para interagir com algum outro

    tipo de brinquedo, bastaria passar um objeto da classe Avio ou Barco na chamada ao

    construtor da classe ControleRemoto. A capacidade do objeto (brinq) do tipo Brinquedo

    da classe ControleRemoto de receber qualquer um objeto de subclasses da classe

    Brinquedo que caracteriza o polimorfismo de incluso.

  • 7/22/2019 Polimorfismo de sobreposio e incluso

    13/13

    Referncias:

    http://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/au

    la_12.html

    http://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/aula_12.htmlhttp://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/aula_12.htmlhttp://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/aula_12.htmlhttp://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/aula_12.html