Polimorfismo: Um exemplo prático
Tags: java, polimorfismo, poo, backend
Published: 2023-08-29 19:14:40

## **MOTIVAÇÃO**

Sempre tive a intenção de escrever posts a respeito de programação e venho procrastinando essa atividade há bastante tempo. Como primeiro post, escolhi tentar organizar um pensamento que sempre tive dificuldade de explicar quando me perguntavam, o polimorfismo. Antes disso vou dar uma breve introdução a respeito dos pilares da programação orientada a objetos e depois adentrarei nos exemplos práticos.

## **UM BREVE RESUMO SOBRE OS PILARES DA PROGRAMAÇÃO ORIENTADA A OBJETOS**

A POO é um dos paradigmas de programação existentes (temos outros como esses [aqui](https://pt.wikipedia.org/wiki/Paradigma_de_programa%C3%A7%C3%A3o#Exemplos)) e que é bastante utilizado ao redor do mundo no desenvolvimento de aplicações. Ela tem o intuito de abstrair coisas do mundo real e representá-las em forma de objetos de acordo com o contexto do que queremos fazer. 

A programação orientada a objetos é baseada em 4 pilares fundamentais que são:

- _Abstração_: envolve a capacidade de pegar um problema que queremos resolver e abstrair suas características essenciais e ignorar os detalhes irrelevantes para o contexto para identificarmos os objetos desse problema.
- _Encapsulamento_: esse conceito se refere à possibilidade de podermos proteger os detalhes internos de um objeto que criamos fazendo com que possamos alterar a visibilidade desses componentes de acordo com a necessidade do problema, fazendo com que as informações dos atributos e métodos só possam ser acessadas por quem realmente pode acessar.
- _Herança_: esse pilar consiste em poder reaproveitar atributos e métodos (sobrescrevendo esses métodos quando necessário) de uma classe "pai" nas classes filhas (subclasses).
- _Polimorfismo_: para mim, esse é o conceito mais complicado da orientação a objetos. O polimorfismo permite que possamos tratar objetos de diferentes classes da mesma forma forma desde que implementem uma interface em comum ou que extendam da mesma classe pai. Isso permite que diferentes tipos de objetos respondam de maneira similar a chamadas de métodos.

## **EXEMPLO PRÁTICO DE POLIMORFISMO**

**POLIMORFISMO UTILIZANDO HERANÇA**

Vamos imaginar o contexto de uma escola e que a remuneração dos professores varia de acordo com a matéria.

Temos a classe “pai” Professor:


![Java Class Professor](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8msrom0qco3bfyn8caql.png)

Agora temos as classes de professores: ProfessorHistoria, ProfessorMatematica e ProfessorQuimica. Cada um desses professores possui um cálculo de remuneração diferente como podemos observar nas imagens abaixo:


![Java Class Professor Historia](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcgqrzwqu1vtq2jfmozk.png)


![Java Class Professor Matematica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mw6fwghn5jpvnqiw686k.png)


![Java Class Professor Quimica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yhpw4zu3n363td0nl1r.png)

Com isso criado, temos abaixo o método `main` onde instanciamos 3 objetos diferentes (1 para cada tipo de professor). No print das informações, chamei o método `calculaRemuneracao` e ele irá se comportar de maneira semelhante mesmo sendo de 3 lugares diferentes. Coloquei todos os professores com o mesmo valor hora e com a mesma quantidade de horas trabalhadas para que possamos ver a diferença no resultado da remuneração de cada um, uma vez que cada tipo de professor tem um cálculo de remuneração diferente.


![Java Class Main](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbbkun7fcdubfti8ou05.png)

Esse é um exemplo prático de como podemos aproveitar o polimorfismo quando possuímos uma relação de herança na hierarquia das classes.

**POLIMORFISMO UTILIZANDO INTERFACES**

Nesse caso, vamos imaginar um cenário parecido mas agora temos uma empresa que possui os seguintes funcionários: Professor, Monitor e Coordenador. Cada um desses funcionários possui atributos diferentes mas para todos eles precisamos calcular o valor da sua remuneração mensal. Portanto, nesse caso implementei a interface Financeiro que possui o método `calculaRemuneracaoMensal` e em cada uma das classes (Professor, Monitor e Coordenador) fiz a implementação desse método de acordo com forma de remuneração de cada um. Abaixo segue o código das 3 classes e da interface Financeiro para poderem observar:


![Java Class Monitor](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vphs8pk975c9ylbedwlx.png)


![Java Class Professor](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6iz1jf1lmmlzatutdxr6.png)


![Java Class Coordenador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ed322jofb09l0ii250md.png)


![Java Interface Financeiro](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rb32n6vzdipji0kwfg9n.png)

Isso posto, podemos observar na classe `Main`, o método `printaSalarioFuncionario` espera uma instancia da interface Financeiro e não uma classe específica de Monitor, Professor ou outra. Assim podemos passar na chamada desse método qualquer classe que implemente a interface Financeiro fazendo com que possamos nos aproveitar do que o polimorfismo nos oferece.


![Java Class Main](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6apeug5jzhap7c76z3pq.png)

Com esses exemplos acima consegui organizar esse conceito na minha cabeça e espero que quem dê uma lida e esteja precisando consiga ser ajudado também.