Desvendando a Orientação a Objetos — Parte 2

Andre Santarosa
3 min readNov 20, 2019

Como prometido, segue a continuação do artigo sobre Herança e Polimorfismo, e agora que já entendemos como funciona a herança, podemos seguir em frente. Se você não entendeu algum ponto, comente no primeiro post que eu responderei as dúvidas =)

Para os códigos de demonstração estou utilizando C#

O polimorfismo é exatamente o que o seu nome representa — Poli: Muitos, Morphos: Formas — ou seja, muitas formas. Ele é essencialmente utilizado para mudar o comportamento de métodos herdados de classes pai. Pode parecer confuso, mas com alguns exemplos conseguiremos demonstrar melhor.

Voltemos ao nosso mapa de classes e heranças:

Temos duas classes que herdam de VeiculoMaritimo: Submarino e Navio. Ambas as classes herdam o método MoverParaTras que tem a seguinte implementação

Se pararmos para pensar, um navio e um submarino tem mais ou menos a mesma maneira de voltar para trás , que é revertendo os propulsores. Então, vamos melhorar esse método para representar de forma mais próxima à real esse comportamento.

Essa maneira genérica já resolve o problema de retroceder em alguns metros com um submarino ou um navio, mas e se quisermos mudar esse comportamento para tratar de uma maneira um pouco mais específica cada um deles? Criaríamos um método MoverSubmarinoParaTras para o submarino e um MoverNavioParaTras para um navio? Isso funcionaria, entretanto acabaríamos não aproveitando a herança como se deve, além de acabar com um código mais bagunçado, visto que ainda existira o método MoverParaTras que está sendo herdado e teria seu comportamento diferente da nova implementação. Há uma maneira um pouco mais concisa para implementar essa funcionalidade para cada um dos filhos de VeiculoMaritimo.

Repare no código abaixo que temos uma palavra a mais (virtual) na assinatura* do método MoverParaTras. Essa palavra-chave permite que alteremos o comportamento do método na classe filha, preservando ainda sua assinatura. Imagine a seguinte situação: alguém tem que arremessar uma bola assim que você gritar “Arremesse!” (essa é a assinatura do método), entretanto, uma hora você está gritando para um jogador de basquete e outra hora para um jogador de baseball. O comando é o mesmo, mas o comportamento é completamente diferente. Isso é polimorfismo!

(*) A assinatura de um método consiste no nome que damos a esse método e seus parâmetros. No caso de MoverParaTras(int metros), MoverParaTras é o nome e metros é o parâmetro.

Vamos considerar que para voltar um submarino temos que apertar um botão para reverter os propulsores e no navio temos que puxar uma alavanca para trás. Nesse caso teríamos as seguintes implementações:

Para o submarino:

Para o navio:

Perceba que a assinatura do método é a mesma, mas o comportamento mudou. Quando chamamos MoverParaTras de um submarino, nós apertamos um botão, quando chamamos de um navio, nós puxamos uma alavanca. Para conseguirmos sobrescrever o comportamento de um método que pertence a classe pai, nós utilizamos a palavra-chave override. Esse é o polimorfismo clássico, mas também temos o polimorfismo por sobrecarga de método.

O polimorfismo por sobrecarga de método é quando mantemos o nome do método, mas mudamos os seus parâmetros. Como comentei acima, a assinatura é composta do nome e dos parâmetros, logo, se alteramos algum deles, temos uma nova assinatura. Vamos criar um método que faz com que um VeiculoMaritimo não só volte para trás, mas volte com uma velocidade determinada. O nome ainda é MoverParaTras, mas agora além da quantidade de metros a voltar ele recebe a velocidade com a qual a manobra deve ser executada.

Mantendo o mesmo nome aumentamos a concisão do nosso código, ao invés de termos MoverParaTras e MoverParaTrasComVelocidade temos apenas um MoverParaTras que recebe parâmetros diferentes.

É isso, pessoal! Espero que eu tenha colaborado um pouco com essa explicação. No próximo artigo, tratarei sobre encapsulamento. Até lá!

--

--

Andre Santarosa

C#/.Net Senior Developer @Viatel Ireland. Likes to cook on the weekends and to play old songs on the guitar.