Java – Polimorfismo

Olá pessoal…

Hoje vamos falar um pouco sobre Polimorfismo, uma especialidade da programação orientada a objetos (P.O.O.) que permite que classes filhas herdem os mesmos métodos da classe pai com a mesma assinatura, porém com funções distintas, mas isso não é só.

Vamos começar do começo (Á Vá!)…

O que é polimorfismo?

A palavra Polimorfismo deriva do grego e quer dizer “muitas formas”  (poli = muitas, morphos = formas), o conceito é utilizado nas mais diversas ciências como Química, Biologia etc.

Podemos utilizar polimorfismo nas mais diversas formas,  veremos algumas:

No exemplo abaixo podemos utilizar Polimorfismo de método também chamado de Override (Sobrescrita de Método) quando temos um método com a mesma assinatura e que tem comportamentos diferentes (ou seja é um método Polimórfico, são métodos iguais que se comportam de maneiras diferentes) para implementação do método utilizamos @Override.

Construímos o seguinte cenário:

Em uma empresa todos são funcionários, embora tenha uma hierarquia, sendo assim, temos supervisores que ganham mais que um funcionário normal e gerentes que ganham mais do que supervisores, um funcionário normal ganha R$ 500,00, um supervisor ganha R$ 500,00 a mais que o funcionário normal (R$ 1000,00) e o gerente ganha R$ 500,00 a mais que o supervisor (R$ 1500,00). Neste contexto já matamos algumas charadas para a realização do programa, já que todo supervisor e gerente também é funcionário temos uma herança.

Como ficaria isso em código:

Crio a classe Funcionário, com o atributo salário, onde armazeno o dado de valor do salário de um funcionário comum, posso nesse caso chamar de generalização pois sei que todo Supervisor e Gerente é Funcionário.

Classe Funcionario

Repare que o método calculaSalario() define o valor de 500,00 para funcionário e retorna seu valor.

Agora o código de Supervisor:

Classe Supervisor

Repare que eu criei o mesmo método da classe pai, nesse caso  ele recebe o valor de salário de funcionário e soma mais 500,00.

O código de Gerente ficaria assim:

Classe Gerente

Na classe Gerente defini o mesmo método da classe pai sobrescrito e adicionei mais 1000,00 ao salário de funcionário.

Na pratica o mesmo método se comporta de maneiras diferentes e distintas quando chamados na instancia do objeto, se eu instancio o objeto como Funcionario e chamo o método calculaSalario(), ele se comportará como Funcionário e retornara o valor do salário do funcionário (R$ 500,00), se eu instancio o objeto como Supervisor o método calculaSalario() se comportara como Supervisor, executando o método do Pai e em seguida o do Filho sobrescrevendo o método do Pai, ou seja, executa o método do pai retornando R$ 500,00 se sobrescreve em cima com o método filho que pega o valor do pai e soma mais R$ 500,00 retornando um salário de R$ 1000,00, da mesma forma acontece com Gerente.

Veremos como fica nossa classe Main():

Classe Main(Principal)

Como podemos observar, os métodos são os mesmos mais tem comportamentos diferentes, dependendo do objeto que é instanciado e tem a sua chamada (Polimorfismo – o mesmo método se comportando de maneira diferente).

Resultado:

Resultado

Notem que todos os métodos sobrescritos tem a palavra-chave @Override, se for omitida não causará erro, apenas um warning do compilador, porém para uma boa prática de programação é obrigatório seu uso.

Polimorfismo de Classes

Para falar um pouco sobre Polimorfismo de classe devemos entender primeiro o que são classes abstratas.

Classes abstratas possuem um papel fundamental em Java e na P.O.O., através delas podemos implementar outras classes que podem vir a serem concretas, classes abstratas não podem ser instanciadas como classes concretas, com o new, porém podem ser herdadas por outras classes concretas.

Classes abstratas podem conter ou não métodos abstratos e podem possuir atributos e métodos construtores, os métodos abstratos devem obrigatoriamente ser implementado na classe concreta. Para criarmos uma classe abstrata ou um método abstrato utilizamos a palavra chave abstract.

Criamos o seguinte cenário:

Elaboramos um programa que efetue cálculos com dois números inteiros, porém esses cálculos ainda não sabemos quais são, só sei que devo fazer operações básicas matemáticas.

Vamos ver um exemplo de Polimorfismo de classe com uma classe abstrata:

Classe Abstrata Calculo

Criada uma classe abstrata com todos os valores que necessito, 2 atributos que recebem valores inteiros, métodos Get e Set (lembrando que os atributos são private e não podem ser acessados pelos filhos diretamente, são criados Get e Set para pegar e setar esses atributos – Encapsulamento), e um método abstrato que retorna valor inteiro.

Agora preciso implementar as outras classes, farei a classe concreta soma, que deverá implementar o método calculaValor():

Classe Concreta Soma

Faço o mesmo com subtração:

Classe Concreta Subtracao

Na classe Main()(Principal) ficaria assim:

Classe Main(Principal)

Vamos verificar que no nosso método estático eu passo como parâmetro uma classe do tipo Calculo que será exibido o método calculaValor(), em seguida chamo o método exibeCalculo() passando como parâmetro uma nova instancia de Soma() e uma nova instancia de Subtracao().

Na verdade seria como se eu tivesse instanciado da seguinte maneira:

Calculo cl = new Soma();

Quando faço isso digo para o objeto Soma() se comportar como Calculo() + Soma() acontece uma “junção das duas classes” ora Calculo será Soma() e hora Calculo será Subtracao(), pois Calculo é abstrato, acaba se tornando Soma ou Subtracao.

Com esses conceitos fica claro que o Polimorfismo é muito importante na orientação a objetos, pode poupar algumas linhas de código a mais, reaproveitamento de código é algo muito útil para a programação mais eficiente. Em Java, podemos criar classes abstratas que não existem e acabam se tornando classes concretas, métodos podem ser sobrescritos facilitando a manutenção de código e poupando escritas de métodos desnecessários.

É isso pessoal !!!

Até mais. :D


About these ads
Esse post foi publicado em Java e marcado , , , , , , , , , , . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s