Pular para o conteúdo
.NETHerança e polimorfismo
Módulo 01Fundamentos da Plataforma e da Linguagem

Herança e polimorfismo

intermediario 30 min de leitura·Atualizado · .NET 9
Resumo

Herança permite que uma classe reaproveite e especialize outra. Polimorfismo permite tratar objetos diferentes pela mesma interface base, com virtual/override decidindo 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.

Carregando diagrama…

4. Mão na Massa#

4.1. Setup#

Shell
dotnet new console -n Catalog.Heranca
cd Catalog.Heranca

4.2. Implementação Passo a Passo#

  1. Base com método virtual e derivadas:
C#
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";
}
  1. Polimorfismo em ação:
C#
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#

Shell
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çaEvite
Herança quando há um "é um(a)" realHerança só para reaproveitar código (prefira composição)
Marcar como virtual só o que deve ser especializadoHierarquias profundas e frágeis
Usar override corretamenteEsconder 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 Notificacao e derivadas Email e Sms.
  • 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#

05-02 — Herança e polimorfismo | Curso ASP.NET Core