Polimorfismo
Origem: Wikipédia, a enciclopédia livre.
- Nota: Se procura outros significados para Polimorfismo, consulte Polimorfismo (desambiguação).
Orientação a objetos |
Objeto |
Classe |
Abstração |
Métodos |
Atributo |
Encapsulamento |
Herança |
Polimorfismo |
Outras referências |
Padrões de projeto |
UML |
Engenharia OO |
Na programação orientada a objetos, o polimorfismo permite que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que referenciam. Assim, um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a representa. O termo polimorfismo é originário do grego e significa "muitas formas" (poli = muitas, morphos = formas).
Índice |
[editar] 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 operação matemática. 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.
Definamos então, 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 código 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 Contas.mostrarCalculo(new Subtracao(), 5, 5); //Imprime o resultado é: 0 } }
Note que, embora o método calcular tenha sido chamado duas vezes no interior de mostrarCalculo, o comportamento apresentado variou de acordo com a classe ao qual ele representava no momento. É comum definir sobrecarga de métodos ou simplesmente sobrecarga como uma forma de polimorfismo embora esta definição deixe lacunas conceituais.
[editar] Benefícios do polimorfismo
[editar] Clareza e manutenção do código
Em linguagens de programação não polimórficas, para implementar o método mostrarCalculo, seria necessário recorrer a uma enumeração com o tipo de operação e, dentro do método, testar o valor da enumeração com um case, como no exemplo abaixo:
public void mostrarCalculo (int 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 operacoes default: throw new UnsupportedOperationException() } }
Além do código ser maior e mais difícil de ler, essa implementação tem outros problemas. Provavelmente esse não será o único método a utilizar operações matemáticas e, portanto, pode-se esperar não um, mas vários switchs como esse pelo código. O que acontece, então, se uma nova operação for adicionada ao sistema? Será necessário que todos os switchs sejam encontrados e substituídos. Com o polimorfismo, a modificação restringiria-se apenas a criação de uma nova classe.
[editar] Divisão da complexidade
Com o polimorfismo pode-se separar métodos genéricos de métodos mais específicos, dividindo a aplicação de acordo com o seu grau de abstração. Bibliotecas que usam esse recurso (herança+polimorfismo) são chamadas frameworks. Exemplos de frameworks conhecidas sao a VCL do Delphi, o Swing do Java.
[editar] Aplicações flexíveis
O polimorfismo combinado à reflexão permite facilmente a criação de plugins. A aplicação original cria interfaces e classes que tem muito conhecimento semântico, mas a sua implementação efetiva ficará a cargo de terceiros. Uma aplicacao gráfica, por exemplo, poderia ser implementada de forma a desenhar linhas, formas e gráficos precisos de acordo com operacões matemáticas fornecidas. Enquanto isso, empresas terceiras, nos diversos campos de sua atuação, implementariam as operações matemáticas específicas para o seu empreendimento (cálculos de órbitas para astronomia, cálculos estruturais para engenharia civil, balística para aeronáutica, etc).
[editar] Polimorfismo e padrões de projeto
Boa parte dos padrões de projeto de software baseiam-se no uso de polimorfismo, por exemplo: Abstract Factory, Composite, Observer, Strategy, Template Method, etc.
O polimorfismo também é usado em uma série de refatorações, como substituir condicional por polimorfismo.