Polimorfismo.pdf
-
Upload
max-welton -
Category
Documents
-
view
45 -
download
2
Transcript of Polimorfismo.pdf
![Page 1: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/1.jpg)
UFG - Instituto de Informática
Curso: Ciências da Computação
Programação Orientada a ObjetosProf.: Fabrízzio A A M N [email protected]
Aula 16 – Polimorfismo
![Page 2: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/2.jpg)
O que é 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.
![Page 3: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/3.jpg)
Tipos de polimorfismo
Polimorfismo
Universal
Paramétrico
Ad-hoc
Inclusão Sobrecarga Coerção
Classificação segundo Cardelli e Wegner 1985.
![Page 4: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/4.jpg)
Polimorfismo Ad-hoc
Não existe um modo único e sistemático de determinar o tipo de resultado de uma função em termos dos tipos dos seus argumentos de entrada.
É uma forma limitada de polimorfismo. Possui duas formas: coerção e sobrecarga.
![Page 5: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/5.jpg)
Polimorfismo Universal
Trabalha potencialmente num conjunto infinito de tipos de modo disciplinado.
Possui duas formas: paramétrico e inclusão.
![Page 6: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/6.jpg)
Polimorfismo de Coerção
Meio para contornar a rigidez dos tipos monomórficos.
Existe um mapeamento interno entre tipos. Exemplo:
Se o operador soma é definido como tendo 2 parâmetros reais e um inteiro e um real são passados como parâmetros, o inteiro é “coagido” para um real.
![Page 7: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/7.jpg)
Polimorfismo de Sobrecarga
Permite que um nome de função seja utilizado mais do que uma vez com diferentes tipos de parâmetros.
Exemplo: Uma função soma pode ser sobrecarregada para
operar com dois parâmetros inteiros e dois reais.
![Page 8: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/8.jpg)
Polimorfismo Paramétrico
Uma única função é codificada e ela trabalhará uniformemente num intervalo de tipos. Funções paramétricas também são chamadas
de funções genéricas. Exemplo:
Templates em C++ Generics em Java
![Page 9: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/9.jpg)
Polimorfismo de Inclusão
É encontrada somente em linguagens orientadas a objetos e
está relacionada com a noção de subtipo. Exemplo:
Hierarquia de classes.
![Page 10: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/10.jpg)
Polimorfismo
Em Java, por exemplo, temos o Polimorfismo de coerção; Polimorfismo paramétrico (através do uso de
identificador entre os sinais de maior e menor <>);
Polimorfismo de sobrecarga e Polimorfismo de inclusão.
![Page 11: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/11.jpg)
Exemplo de Polimorfismo de inclusão
Suponhamos o seguinte exemplo:
public abstract class OperacaoMatematica {
public abstract double calcular(double x, double y);
}
Esta é uma classe abstrata que representa qualquer operação matemática.
![Page 12: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/12.jpg)
Exemplo de Polimorfismo de inclusão
Podemos imaginar diversas operações que se encaixam na sua interface, como soma, subtração, multiplicação ou divisão, entre outras.
Note que, mesmo que a natureza do cálculo mude, a semântica do método calcular não muda, ou seja, ele sempre calculará o resultado da operação matemática que está sendo trabalhada.
![Page 13: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/13.jpg)
Exemplo de Polimorfismo de inclusão
Definamos então, duas subclasses, Soma e Subtração, que implementam a classe OperacaoMatematica:
public class Soma extends OperacaoMatematica { public double calcular(double x, double y) { return x+y; }} public class Subtracao extends OperacaoMatematica { public double calcular(double x, double y) { return x-y; }}
![Page 14: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/14.jpg)
Exemplo de Polimorfismo de inclusão
O seguinte trecho de código demonstra sem o polimorfismo:public class Contas { public static void main(String args[]) {
//Primeiro calculamos uma soma Soma sum = new Soma(); System.out.println("O resultado é: + sum.calcular(5, 5));
//Depois uma subtração Subtracao dif = new Subtracao(); System.out.println("O resultado é: + dif.calcular(5, 5)); }}
![Page 15: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/15.jpg)
Problema
Como faríamos para passar o objeto para uma função que irá realizar as operações para nós?
Precisaríamos criar um método para tratar cada objeto!
![Page 16: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/16.jpg)
Continuação do exemplo
Possível solução (sem polimorfismo):public class Contas { public static void mostrarCalculoSoma(Soma operacao, double x, double y) { System.out.println("O resultado é: " + operacao.calcular(x, y)); } public static void mostrarCalculoSub(Sub operacao, double x, double y) { System.out.println("O resultado é: " + operacao.calcular(x, y)); } public static void main(String args[]) { //Primeiro calculamos uma soma Soma sum = new Soma(); Contas.mostrarCalculoSoma(sum, 5, 5); //Imprime o resultado é: 10 //Depois uma subtração Subtracao dif = new Subtracao(); Contas.mostrarCalculoSub(dif, 5, 5); //Imprime o resultado é: 0 }}
![Page 17: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/17.jpg)
Exemplo
O seguinte trecho de código demonstra com o polimorfismo:public class Contas { public static void main(String args[]) {
//Primeiro calculamos uma soma OperacaoMatematica sum = new Soma(); System.out.println("O resultado é: + sum.calcular(5, 5));
//Depois uma subtração OperacaoMatematica dif = new Subtracao(); System.out.println("O resultado é: + dif.calcular(5, 5)); }}
![Page 18: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/18.jpg)
Continuação do Exemplo
Assim, se quiséssemos passar para uma função realizar as operações poderíamos fazer:
public class Contas { public static void mostrarCalculo(OperacaoMatematica operacao, double x,
double y) { System.out.println("O resultado é: " + operacao.calcular(x, y)); } public static void main(String args[]) { //Primeiro calculamos uma soma Soma sum = new Soma(); Contas.mostrarCalculo(sum, 5, 5); //Imprime o resultado é: 10 //Depois uma subtração Subtracao dif = new Subtracao(); Contas.mostrarCalculo(dif, 5, 5); //Imprime o resultado é: 0 }}
![Page 19: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/19.jpg)
Exemplo com animais
Para não perdermos o velho costume, vamos a exemplos com animais!
Temos três classes, Animal, Cachorro, Cobra. Analisando podemos perceber que Cachorro e
Cobra são animais, más com características diferentes.
Exemplo locomover O cachorro anda com suas quatro patas e a cobra
se rastejando.
![Page 20: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/20.jpg)
Exemplo com animais
![Page 21: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/21.jpg)
Vamos ao código
Classe Animal:
public abstract class Animal {
public abstract String andar();
}
![Page 22: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/22.jpg)
Vamos ao código
Classe Cachorro:
public class Cachorro extends Animal {
public String andar(){
return ("Cachorro: se locomove com
quatro patas");
}
}
![Page 23: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/23.jpg)
Vamos ao código
Classe Cobra:
public class Cobra extends Animal {
public String andar(){
return ("Cobra: se locomove rastejando");
}
}
![Page 24: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/24.jpg)
Vamos ao código
Programa para testar as classes/objetos polimórficos:
public class Polimorfismo { public static void main(String args[]){ Animal anim [] = new Animal[2]; anim[0] = new Cachorro(); anim[1] = new Cobra(); for (int i=0;i < anim.length;i++){ System.out.println(anim[i].andar()); } }}
![Page 25: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/25.jpg)
Observações sobre o polimorfismo de inclusão
Toda classe que pode se comportar como qualquer uma de suas ancestrais
Quando se usa polimorfismo não se muda o tipo do objeto.
Ele nasce de um tipo e morre do mesmo tipo. O que se trocou foi sua casca (interface)
![Page 26: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/26.jpg)
Observações sobre o polimorfismo de inclusão
Quando se atribui um objeto a uma variável de um tipo ancestral, você terá um comportamento polimórfico
Mas o contrário não é verdade. Por via de regra, não se pode atribuir um objeto a
um tipo sucessor
Pessoa p = new PessoaFisica() // ok
PessoaFisica pf = new Pessoa() // errado
![Page 27: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/27.jpg)
Observações sobre o polimorfismo de inclusão
Quando se atribui um objeto a uma variável de um tipo ancestral, você terá um comportamento polimórfico
Mas o contrário não é verdade. Por via de regra, não se pode atribuir um objeto a
um tipo sucessor
Pessoa p = new PessoaFisica() // ok
PessoaFisica pf = new Pessoa() // errado
![Page 28: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/28.jpg)
Observações sobre o polimorfismo de inclusão
Se você tiver um objeto de um tipo e está usando a casa (interface) de seu ancestral, não será possível acessar os métodos e atributos do objeto original.
Pessoa p = new PessoaFisica(“111.111.111-11”);
String cpf = p.getCPF(); //errado
![Page 29: Polimorfismo.pdf](https://reader031.fdocumentos.tips/reader031/viewer/2022020219/55cf9c46550346d033a9421a/html5/thumbnails/29.jpg)
Observações sobre o polimorfismo de inclusão
Porém, se você tiver certeza que o objeto é de um tipo, você pode forçar um “Casting”.
Pessoa p = new PessoaFisica(“111.111.11111”);String cpf = (PessoaFisica)p.getCPF(); // ok
ouPessoa p = new PessoaFisica(“111.111.11111”);PessoaFisica pf = (PessoaFisica)p;String cpf = pf.getCPF(); // ok