DEV Community

Cover image for POO Além do Código #4: Polimorfismo (A Versatilidade)
Bruno Freschi
Bruno Freschi

Posted on

POO Além do Código #4: Polimorfismo (A Versatilidade)

"A capacidade de tratar diferentes objetos através de uma interface comum."

📜 A Perspectiva Histórica

Nos primeiros sistemas orientados a objetos, era comum usar grandes blocos de if e switch para decidir o comportamento do programa.
Cada novo tipo exigia alterar o código existente, aumentando o risco de bugs e tornando o sistema difícil de manter.

O Polimorfismo surgiu como solução para esse problema.
Em vez de perguntar "que tipo é esse?", o código passa a dizer "faça isso", e cada objeto sabe como responder.

Esse conceito permitiu criar sistemas extensíveis, onde novos comportamentos podem ser adicionados sem modificar o código antigo.
Essa ideia é a base do princípio Open/Closed Principle (Aberto para extensão, fechado para modificação).


💡 O Conceito

Polimorfismo significa múltiplas formas.

Objetos diferentes podem ser tratados da mesma maneira, desde que compartilhem um contrato comum (interface ou classe base).

  • O código trabalha com o tipo abstrato
  • Cada objeto executa sua própria implementação
  • O comportamento muda sem mudar o código que chama

O foco do Polimorfismo é a EXTENSIBILIDADE e a FLEXIBILIDADE.


🛠️ No Mundo Real (Agnóstico)

Imagine um Controle Remoto Universal:

  • O controle tem um botão "Ligar"
  • A TV liga de um jeito
  • O Ar-condicionado liga de outro
  • O Videogame liga de outro

O controle não precisa saber como cada aparelho funciona.
Ele só chama o mesmo comando.

Cada aparelho responde do seu próprio jeito.

Isso é Polimorfismo.


💻 Implementação em C# (Nossa Ferramenta)

Sem polimorfismo, o código fica rígido e cheio de condições.

Com polimorfismo, usamos interfaces ou classes base.

// Contrato comum
public interface IMetodoPagamento
{
    void Pagar(decimal valor);
}

// Implementação 1
public class PagamentoCartao : IMetodoPagamento
{
    public void Pagar(decimal valor)
    {
        Console.WriteLine($"Pagando {valor} no cartão");
    }
}

// Implementação 2
public class PagamentoPix : IMetodoPagamento
{
    public void Pagar(decimal valor)
    {
        Console.WriteLine($"Pagando {valor} via PIX");
    }
}

// Implementação 3
public class PagamentoBoleto : IMetodoPagamento
{
    public void Pagar(decimal valor)
    {
        Console.WriteLine($"Pagando {valor} com boleto");
    }
}

// Classe que usa polimorfismo
public class ProcessadorPagamento
{
    public void Processar(IMetodoPagamento metodo, decimal valor)
    {
        metodo.Pagar(valor);
    }
}
Enter fullscreen mode Exit fullscreen mode

Uso:

var processador = new ProcessadorPagamento();

IMetodoPagamento p1 = new PagamentoCartao();
IMetodoPagamento p2 = new PagamentoPix();
IMetodoPagamento p3 = new PagamentoBoleto();

processador.Processar(p1, 100);
processador.Processar(p2, 200);
processador.Processar(p3, 300);
Enter fullscreen mode Exit fullscreen mode

Se amanhã surgir um novo tipo:

public class PagamentoCripto : IMetodoPagamento
Enter fullscreen mode Exit fullscreen mode

Nada precisa ser alterado no código existente.

Isso é Polimorfismo.


🎯 Desafio de Mentalidade

Ao olhar para o código nesta pasta, pergunte-se:

  1. Estou usando muitos if ou switch para decidir comportamento?
  2. Posso substituir isso por interface ou classe base?
  3. Meu código aceita novos tipos sem precisar ser modificado?
  4. Estou programando para a implementação ou para a abstração?
  5. Se eu adicionar um novo comportamento, preciso mexer no código antigo?

Top comments (0)