Hoje o assunto é bem objetivo, vamos falar a respeito de Polimorfismo.
O que é Polimorfismo?
A primeira vista, parece algo como "Várias Formas", na verdade não é tudo isso. Encontrei uma definição bem interessante dada pelo Ivan Ricarte, da Unicamp, onde: "Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia."
Bom e aí, será que ficou claro? Talvez com um exemplo mais simples, dê para entender.
Vou escrever em C#, é bem simples de replicar em Java.
Imagine que você tenha a necessidade de fazer com que Diferentes Classes possuam comportamentos semelhantes:
Em um dos meus exercícios aqui na Lambda3, tive que construir um "processador de URL's", algo que avalia o conteúdo de uma URL e de acordo faz determinada ação.
Nosso processador, não precisa encapsular diversos métodos, pois assim estaríamos dando muita responsabilidade para apenas uma classe, então basicamente o que nosso processador fará é Armazenar uma
Armazenará uma URL e a processará.
ProcessadorUrl:
class ProcessadorUrl { private readonly String endereco; public ProcessadorUrl(String url) { this.endereco = url;} public String ProcessaUrl() { return endereco; } }
Feito isso, da pra entender um pouco o que precisamos fazer. Basicamente, agora faremos as classes avaliadoras:
Farei apenas duas, para compreensão simples.
Primeira classe avaliadora:
class AvaliadorGoogle { private readonly String endereco; public AvaliadorGoogle(String endereco) { this.endereco = endereco; } public bool Avalia() { return endereco.Contains("google"); } public string Executa() { return endereco.Replace("google", "bing"); } }
Segunda classe avaliadora:
class AvaliadorAsdrubal { private readonly String endereco; public AvaliadorAsdrubal(String endereco) {
this.endereco = endereco; }
public bool Avalia() {
return endereco.Contains("asdrubal"); } public string Executa(){
return endereco.Replace("asdrubal", "outro"); } }
Agora nosso processador de URL pode fazer as comparações e retornar o necessário:
class ProcessadorUrl { private readonly String endereco; public ProcessadorUrl(String url) { this.endereco = url; } public String ProcessaUrl() { if(new AvaliadorGoogle(endereco).Avalia()) return new AvaliadorGoogle(endereco).Executa(); if(new AvaliadorAsdrubal(endereco).Avalia()) return new AvaliadorAsdrubal(endereco).Executa(); return ""; } }
Então podemos notar que ambas classes, AvaliadorGoogle e AvaliadorAsdrubal, possuem comportamentos semelhantes, por que não fazer uso do Polimorfismo?
Crie uma nova Interface e de o nome de Avaliacao:
interface Avaliacao { bool Avalia(); String Executa(); }
Agora os nossos Avaliadores implementarão essa interface:
class AvaliadorAsdrubal : Avaliacao { private readonly String endereco; public AvaliadorAsdrubal(String endereco) {
this.endereco = endereco; } public bool Avalia() {
return endereco.Contains("asdrubal"); } public string Executa() {
return endereco.Replace("asdrubal", "outro"); } }
Faça o mesmo para o avaliador Google e beleza! Vamos a classe que processa, podemos fazer bom uso do Polimorfismo:
public class ProcessadorUrl { private readonly String endereco;
public ProcessadorUrl(String url) { this.endereco = url; }
public String ProcessaUrl() { List<Avaliacao>lista = new List<Avaliacao> }(); lista.Add(new AvaliadorGoogle(endereco)); lista.Add(new AvaliadorAsdrubal(endereco)); for (var i = 0; i < lista.Count; i++){ if(lista[i].Avalia() lista[i].Executa(); } return ""; }
Conseguiram compreender um bom uso do polimorfismo?
Criamos uma Lista de Objetos que implementam a interface Avaliação. Essa, como diz o Jonas, é a parte gostosa da "Herança" :).
Exemplos no meu Github:
https://github.com/aterribili/Mapeando
https://github.com/aterribili/AvaliacaoEnderecosWeb
Qualquer dúvida email-me: abner.terribili@lambda3.com.br ou comente abaixo.
Valeu galera!