"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);
}
}
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);
Se amanhã surgir um novo tipo:
public class PagamentoCripto : IMetodoPagamento
Nada precisa ser alterado no código existente.
Isso é Polimorfismo.
🎯 Desafio de Mentalidade
Ao olhar para o código nesta pasta, pergunte-se:
- Estou usando muitos
ifouswitchpara decidir comportamento? - Posso substituir isso por interface ou classe base?
- Meu código aceita novos tipos sem precisar ser modificado?
- Estou programando para a implementação ou para a abstração?
- Se eu adicionar um novo comportamento, preciso mexer no código antigo?
Top comments (0)