Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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
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.
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:
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.
WWW.DOMINACONCURSOS.COM.BR 5
POLIMORFISMO
É claro que o código pode ser melhorado, mas chegamos a um resultado final bem ajustado.
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
_________________________________________________________________________________
WWW.DOMINACONCURSOS.COM.BR 6