Olá desenvolvedores, hoje falaremos sobre o polimorfismo que é um dos benefícios da herança. Visto que esta é uma característica que se beneficia do fato de que, em Java, toda subclasse é uma superclasse. Entre estes benefícios podemos citar também clareza e manutenção do código e o fato de podermos trabalhar genericamente.
Entenda, a partir dessa característica é possível escrever código genérico para tratar uma infinidade de objetos de classes diferentes. E para isso basta considerar apenas a superclasse comum entre essas classes. Esse código genérico facilita a adição de novos recursos a programas já prontos.
Em outras palavras, “na orientação a objetos, o polimorfismo permite que referências de tipos de classes mais abstratas representam o comportamento das classes concretas que referenciam. Dessa forma é possível tratar vários tipos de maneira homogênea (através da interface do tipo mais abstrato)” _Wikipédia.
O polimorfismo ocorre quando duas ou mais classes derivadas de uma mesma superclasse, podem invocar métodos que tem a mesma assinatura. Entretanto, apresentam comportamentos distintos para cada classe derivada. Assim sendo, temos que os mesmos atributos e objetos podem ser utilizados em objetos distintos, porém, com implementações lógicas diferentes.
Desse modo, podemos entender que o polimorfismo é uma das muitas formas de trabalhar do Java. Onde podemos trabalha com abstração e reutilização de código.
DETALHANDO O POLIMORFISMO
Dentro do contexto do exemplo que estamos trabalhando, quando em polimorfismo falamos de referências, neste cenário estamos falando das classes Aluno, Diretor e Secretário. Estas classes são uma abstração da classe Pessoa.
Ainda neste contexto, temos que a classe Pessoa determina certos comportamentos das classes filhas. Isto ocorre, por exemplo, com a implementação do método abstrato “salario()” que possibilita diferentes lógicas para cada uma das subclasses.
Ressaltando que métodos abstratos não possuem instruções, o que possibilita e facilita a implementação de comportamentos distintos para cada classe derivada.
Os métodos abstratos obrigatoriamente devem ficar dentro da classe abstrata, bem como obrigatório também é a implementação do método pelas classes filhas. É como se elas herdassem esta obrigação. E para escrevê-los, utilizamos um ponto e vírgula (;).
Classe Aluno
public double salario(){
return 1200.00;
}
Classe Diretor
public double salario()
double bonus = 275.00;
return 3785.25 + bonus;
}
Classe secretario
public double salario(){
double valeTransporte = 79.20;
return 1850.75 + valeTransporte;
}
Na classe Pessoa criamos um segundo método que verifica se a “pessoa” é ou não maior de idade. E por estar em uma classe genérica, o mesmo, poderá ser chamado ou reescrito em cada uma das subclasses. Neste caso, não há uma obrigação implícita.
Mas havendo ou não a obrigação de implementação do método, o que torna o polimorfismo um recurso valioso é possibilidade de implementações distintas. Isto é, em cada uma das classes filhas um mesmo método poderá ser implementado obedecendo as necessidades específicas das regras de negócio de cada uma dessas subclasses.
ENTENDENDO O POLIMORFISMO NA PRÁTICA
Para um melhor entendimento da premissa acima criaremos um método que recebe apenas “pessoa”, entretanto três tipos de objetos serão passados a ele. Mas este método saberá apenas que tem que tratar “pessoas”, mas não sabe que tipo de pessoa irá receber. Dessa forma, é dentro do seu escopo que iremos tratar esta parte.
Por meio do polimorfismo poderemos, e muita atenção neste momento, instanciar um objeto do tipo de pessoa de modo que ele se torne um aluno.
Pessoa pessoa = new Aluno();
E depois transformar esse objeto pessoa em um secretário. E de um modo geral, tudo é pessoa. Mas isso somente é possível em função do polimorfismo, que nos permite trabalhar diversos objetos de diferentes formas.
pessoa = secretario
Esta foi apenas uma demonstração do que podemos alcançar com o polimorfismo. Vamos agora a um exemplo prático. Mas atente-se para o que acabou de ocorrer, como a classe Pessoa é abstrata, ela não pode ser instanciada a partir dela mesma Pessoa pessoa = new Pessoa();. Mas note que uma variável do tipo classe Pessoa pode receber a instância de uma classe que estende a classe Pessoa (herança).
Dentro da classe principal, mas fora método main que implementamos para fazermos estes testes, criaremos um novo método. Este método receberá como parâmetro um tipo pessoa. No escopo deste método imprimiremos o nome da pessoa mais seu salário.
Agora sim, dentro do corpo do método main, chamaremos este método três vezes. E em cada uma das vezes como parâmetro passaremos as três subclasses. Veja o exemplo:
testeMetodo(aluno);
testeMetodo(diretor);
testeMetodo(secretario);
Perceba que os três tipos são aceitos, e isto porque são pessoas. E dessa forma todos possuem o getNome e todos tem salário. Assim, quando executarmos ele buscará pelos respectivos dados de cada um. Veja a saída do programa.
EM POUCAS PALAVRAS
Existe um conceito em polimorfismo que diz que o mesmo é caracterizado quando duas ou mais classes distintas têm métodos de mesmo nome. Dessa forma uma função poderá utilizar um objeto de qualquer uma das classes polimórficas. E isso sem necessidade de tratar de forma diferenciada conforme a classe do objeto
Espero que tenham gostado de aprender sobre polimorfismo, e compreendido o que Java nos permite por meio deste conceito.
Nós já havíamos começado a trabalhar com o polimorfismo na prática no tutorial passado, o que fizemos hoje, foi apenas trabalhar o que já havíamos aprendido associado a teoria. O polimorfismo é um recurso poderoso, que nos permite trabalhar de modo flexível, reaproveitando código, o que facilita o trabalho de manutenção do mesmo. Eu fico por aqui, nos vemos no próximo.