Anda di halaman 1dari 3

Polimorfismo

Na programao orientada a objetos, o polimorfismo permite que referncias de tipos de classes mais , possvel tratar vrios tipos de maneira homognea (atravs da interface do tipo mais abstrato). O termo polimorfismo originrio do grego e significa "muitas formas" (poli = muitas, morphos = formas). O polimorfismo caracterizado quando duas ou mais classes distintas tem mtodos de mesmo nome, de forma que uma funo possa utilizar um objeto de qualquer uma das classes polimrficas, sem necessidade de tratar de forma diferenciada conforme a classe do objeto.[1] Uma das formas de implementar o polimorfismo atravs de uma classe abstrata, cujos mtodos so declarados mas no so definidos, e atravs de classes que herdam os mtodos desta classe abstrata.[2] Orientao a objetos Objeto Classe

Instncia

Abstrao Mtodos Atributo Encapsulamento Herana

Herana mltipla

Tipos de polimorfismo

Existem trs tipos de polimorfismo que a linguagem pode ter (atente para o fato de que nem toda linguagem orientada a objeto tem implementado todos os tipos de polimorfismo):

Polimorfismo Outras referncias Padres de projeto UML Engenharia OO

Universal o Incluso - um ponteiro para classe me pode apontar para uma instncia de uma classe filha (exemplo em Java: List lista = new LinkedList(); (tipo de polimorfismo mais bsico que existe) o Paramtrico - se restringe ao uso de templates (C++, por exemplo) e generics (C#/Java) Ad-Hoc o Sobrecarga - duas funes/mtodos com o mesmo nome mas assinaturas diferentes

Exemplos
Suponha a seguinte classe escrita em Java:
public abstract class OperacaoMatematica { public abstract double calcular(double x, double y); }

Esta uma classe abstrata que representa qualquer operao matemtica. Podemos imaginar diversas operaes que se encaixam na sua interface, como soma, subtrao, multiplicao ou diviso, entre outras. Note que, mesmo que a natureza do clculo mude, a semntica do mtodo calcular no muda, ou seja, ele sempre calcular o

resultado da operao matemtica que est sendo trabalhada. Definamos ento, duas subclasses, Soma e Subtracao, 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; } }

O seguinte trecho de cdigo demonstra o uso do polimorfismo:


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 Contas.mostrarCalculo(new Soma(), 5, 5); // Imprime o resultado : 10 // Depois uma subtrao Contas.mostrarCalculo(new Subtracao(), 5, 5); // Imprime o resultado : 0 } }

Embora o mtodo calcular tenha sido chamado duas vezes no interior de mostrarCalculo, os tipos (isto , as classes das instncias) utilizados como parmetros eram diferentes. De fato, o comportamento de cada tipo era exatamente oposto. comum definir sobrecarga de mtodos ou simplesmente sobrecarga como uma forma de polimorfismo (chamado de polimorfismo ad-hoc). Nesse caso, implementa-se mtodos com um mesmo nome, mudando apenas a lista de parmetros que ele recebe. Digamos
public static void mostrarCalculo(Soma soma, double x, double y) { System.out.println("O resultado : " + soma.calcular(x, y)); } public static void mostrarCalculo(Subtracao subtracao, double x, double y) { System.out.println("O resultado : " + subtracao.calcular(x, y)); }

Embora nesse caso o resultado possa ser o mesmo que aquele obtido com o uso de herana, no polimorfismo ad-hoc no existem garantias que os mtodos sobrecarregados tenham o mesmo comportamento.

Benefcios do polimorfismo
Clareza e manuteno do cdigo
Em linguagens de programao no-polimrficas, para implementar o mtodo mostrarCalculo, seria necessrio recorrer a uma enumerao com o tipo de operao e, dentro do mtodo, testar o valor da enumerao, como no exemplo abaixo:
public void mostrarCalculo(String operacao, double x, double y) { System.out.print("O resultado : "); switch (operacao) { case SOMA: System.out.print(x + y); break; case SUBTRACAO: System.out.print(x - y); break; // Outras operaes... default: throw new UnsupportedOperationException(); break; } }

Alm do cdigo ser maior e mais difcil de ler, essa implementao tem outros problemas. Provavelmente esse no ser o nico mtodo a utilizar operaes matemticas e, portanto, pode-se esperar no um, mas vrios switchs como esse pelo cdigo. O que acontece, ento, se uma nova operao for adicionada ao sistema? Ser necessrio que todos os switchs sejam encontrados e substitudos. Com o polimorfismo, a modificao restringiria-se apenas a criao de uma nova classe.

Polimorfismo e padres de projeto


Boa parte dos padres de projeto de software baseiam-se no uso de polimorfismo, por exemplo: Abstract Factory, Composite, Observer, Strategy, Template Method, etc. O polimorfismo tambm usado em uma srie de refatoraes, como substituir condicional por polimorfismo

Anda mungkin juga menyukai