Polimorfismo de sobreposição e inclusão
-
Upload
gilson-de-jesus-aquino -
Category
Documents
-
view
218 -
download
0
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