Herança e polimorfismo
ResumoHerança permite que uma classe reaproveite e especialize outra. Polimorfismo permite tratar objetos diferentes pela mesma interface base, com
virtual/overridedecidindo o comportamento em runtime.
1. Objetivos de Aprendizagem#
- Criar hierarquias com herança.
- Sobrescrever comportamento com
virtual/override. - Entender polimorfismo e quando preferir composição.
2. Pré-requisitos#
- Classes e propriedades (tópico 5.1).
3. Conceito#
- Herança (
: Base): a classe derivada ganha membros da base e pode adicionar/especializar. virtual/override: a base marca um método como sobrescrevível; a derivada o redefine. Em runtime, o método executado é o do tipo real do objeto — isso é polimorfismo.abstract: membro sem implementação que a derivada é obrigada a fornecer.sealed: impede herança/override adicional.
O porquê: escrever código que opera sobre a base e funciona para qualquer especialização, sem if por tipo.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Heranca
cd Catalog.Heranca
4.2. Implementação Passo a Passo#
- Base com método virtual e derivadas:
public class ItemCatalogo
{
public string Nome { get; set; } = "";
public virtual string Descrever() => $"Item: {Nome}";
}
public class Produto : ItemCatalogo
{
public decimal Preco { get; set; }
public override string Descrever() => $"Produto {Nome} — {Preco:C}";
}
public class Servico : ItemCatalogo
{
public int Horas { get; set; }
public override string Descrever() => $"Serviço {Nome} — {Horas}h";
}
- Polimorfismo em ação:
var itens = new List<ItemCatalogo>
{
new Produto { Nome = "Mouse", Preco = 90m },
new Servico { Nome = "Instalação", Horas = 2 }
};
foreach (var item in itens)
Console.WriteLine(item.Descrever()); // chama a versão do tipo real
4.3. Executando#
dotnet run
5. Exemplo Completo#
O laço acima trata tudo como ItemCatalogo, mas cada Descrever() executa a implementação correta (Produto ou Servico) — sem nenhum if de tipo.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Herança quando há um "é um(a)" real | Herança só para reaproveitar código (prefira composição) |
Marcar como virtual só o que deve ser especializado | Hierarquias profundas e frágeis |
Usar override corretamente | Esconder métodos com new sem entender o efeito |
Atenção"prefira composição a herança" é um princípio importante — herança acopla fortemente. Use-a quando a relação for genuinamente hierárquica.
7. Segurança e Produção#
- Hierarquias rasas e claras são mais fáceis de manter e testar; herança excessiva dificulta mudanças seguras.
8. Exercícios#
- Fácil: crie uma base
Notificacaoe derivadasEmaileSms. - Médio: sobrescreva um método
Enviar()em cada uma. - Desafio: reescreva a hierarquia usando composição em vez de herança e compare.
9. Resumo#
Herança especializa uma base; virtual/override habilitam polimorfismo (o tipo real decide o comportamento em runtime). Prefira composição quando não houver relação hierárquica real.
10. Próximos Passos#
A seguir, o contrato máximo de abstração: interfaces e classes abstratas.
11. Referências#
- Microsoft Learn — Herança
- Microsoft Learn — Polimorfismo
- Microsoft Learn — override