Você está na página 1de 6

POLIMORFISMO

Polimorfismo

Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse po-
dem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, es-
pecializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da su-
perclasse. 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.

No caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma identificação,


sendo utilizado o mecanismo de redefinição de métodos. Esse mecanismo de redefinição não deve
ser confundido com o mecanismo de sobrecarga de métodos.

O uso de polimorfismo em Java é ilustrado através de um exemplo. Através desse exemplo introdu-
zem-se os conceitos relacionados de upcasting e a motivação para a definição de métodos abstratos.

É importante observar que, quando polimorfismo está sendo utilizado, o comportamento que será
adotado por um método só será definido durante a execução. Embora em geral esse seja um meca-
nismo que facilite o desenvolvimento e a compreensão do código orientado a objetos, há algumas si-
tuações onde o resultado da execução pode ser não-intuitivo, como ilustra esse exemplo que usa po-
limorfismo em construtores.

Criaremos uma aplicação Console chamada CalcAreaPOO usando o VS 2017 Community para cal-
cular a área do quadrado, retângulo, triângulo e círculo, aplicando os conceitos da POO.

Existem muitas maneiras de implementar o cálculo dessas figuras geométricas e vamos usar uma
abordagem mais simples e aderente às boas práticas e ao paradigma da POO.

O primeiro conceito que usaremos será a herança, e para isso começaremos criando uma classe abs-
trata onde definiremos uma propriedade abstrata chamada CalcularArea, que vai retornar o valor da
área:

Observe que não definimos o acessor set, pois a área é somente leitura e não pode ser definida pelo
usuário.

Poderíamos ter usado uma interface IForma e o resultado final seria o mesmo, mas usar uma classe
abstrata neste contexto pode nos dar a opção de fornecer uma implementação padrão para um novo
método:

A classe abstrata será a classe base a partir da qual iremos herdar e realizar a implementação da
propriedade CalcularArea para cada figura geométrica para qual desejamos calcular a área.

Além disso temos as seguintes diferenças entre Classe abstrata e Interface:

1 – Classes abstratas podem ter constantes, membros, stubs de métodos (métodos sem um corpo) e
métodos definidos, enquanto interfaces só podem ter stubs de constantes e métodos

WWW.DOMINACONCURSOS.COM.BR 1
POLIMORFISMO

2 – Métodos e membros de uma classe abstrata podem ser definidos com qualquer visibilidade, en-
quanto todos os métodos de uma interface devem ser definidos como públicos (eles são definidos por
padrão)

3 – Ao herdar uma classe abstrata, uma classe filha concreta deve definir os métodos abstratos, en-
quanto que uma classe abstrata pode estender outra classe abstrata e os métodos abstratos da
classe pai não precisam ser definidos

4 – Da mesma forma, uma interface que estende outra interface não é responsável pela implementa-
ção de métodos da interface pai. Isso ocorre porque as interfaces não podem definir nenhuma imple-
mentação

5 – Uma classe filha só pode estender uma única classe (abstrata ou concreta), enquanto uma inter-
face pode se estender ou uma classe pode implementar várias outras interfaces

6 – Uma classe filha pode definir métodos abstratos com a mesma visibilidade, ou menos restritiva,
enquanto uma classe que implementa uma interface deve definir os métodos com exatamente a
mesma visibilidade (pública)

Agora a próxima tarefa será criar classes concretas que herdam da classe abstrata Forma e imple-
mente a propriedade CalcularArea:

1 – Classe Quadrado

2 – Classe Retângulo

3 – Classe Triângulo

4 – Classe Círculo

WWW.DOMINACONCURSOS.COM.BR 2
POLIMORFISMO

Em todas as implementações estamos herdando a classe abstrata Forma e sobrescrevendo a propri-


edade CalcularArea para retornar o valor da área da respectiva forma.

Usando propriedades estamos encapsulando o nosso código e podemos incluir lógica extra nos
get/set sem quebrar o código; temos ainda o recurso do data binding disponível se precisarmos dele.

A implementação de CalcularArea usa o recurso Expression Bodied Member que usa expressões
lambdas tornando o código mais conciso e legível.

Estamos aplicando o conceito de polimorfismo de herança, onde Polimorfismo significa muitas for-
mas. Na orientação a objetos você pode enviar uma mesma mensagem para diferentes objetos e
fazê-los responder da maneira correta.

Você pode enviar a mensagem CalcularArea para cada objeto semelhante a uma forma e cada objeto
vai se comportar de maneira diferente para atender à sua solicitação. No caso, calculando a área da
respectiva figura.

Quando uma mesma mensagem pode ser processada de diferentes formas, temos um exemplo de
polimorfismo.

Implementando a interface da aplicação Console

Implementaremos agora a interface da aplicação Console adotando princípios de boa prática de pro-
gramação.

Vamos criar um menu de opções onde o usuário escolhe a forma para qual deseja calcular a área. O
Fluxo será o seguinte:

1. Solicita ao usuário para escolher a figura

2. Cria a figura com base na escolha do usuário

3. Exibe o resultado da área

4. Volta ao menu e solicita uma nova escolha

No arquivo Program.cs inicialmente vamos definir uma enumeração para representar as opções do
menu da nossa aplicação:

A seguir, no método Main() vamos usar a enumeração para apresentar o menu e obter a escolha do
usuário realizando o cálculo e exibição da área da figura selecionada:

WWW.DOMINACONCURSOS.COM.BR 3
POLIMORFISMO

Abaixo temos o código do método GetEscolha(), que exibe as opções e processa a escolha do usuá-
rio:

A seguir temos o código do método GetDouble() que recebe a entrada do usuário e a converte para
double, verificando se é um valor válido

Temos, também, o código das classes para criar cada uma das figuras conforme a escolha do usuá-
rio. A implementação solicita a informação do usuário para os dados necessários para calcular a
área:

WWW.DOMINACONCURSOS.COM.BR 4
POLIMORFISMO

Todas as classes definidas acima retornam uma classe do tipo escolhido pelo usuário.

Executando o projeto iremos obter o resultado que é exibido abaixo:

WWW.DOMINACONCURSOS.COM.BR 5
POLIMORFISMO

Temos assim um exemplo onde aplicamos os recursos de herança, polimorfismos e encapsulamento


de forma a resultar em um código legível e fácil de manter.

É claro que o código pode ser melhorado, mas chegamos a um resultado final bem ajustado.

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

_________________________________________________________________________________

WWW.DOMINACONCURSOS.COM.BR 6

Você também pode gostar