Dominando Herança em C#: Conceitos, Tipos e Código Prático
Herança em C# Explicada
Este guia cobre os fundamentos da herança em C#, suas várias formas e exemplos práticos de código.
Herança em C# permite criar uma nova classe que deriva de uma existente, formando uma relação pai (base) e filho (derivada). Este poderoso recurso da Programação Orientada a Objetos (POO) promove reutilização de código e organização lógica.
A classe base fornece campos, propriedades e métodos que a classe derivada herda, permitindo que o filho estenda ou personalize comportamento enquanto mantém lógica compartilhada em um só lugar.
Como Declarar Herança em C#
Em C#, os dois pontos (:) indicam herança:
class Animal { // campos e métodos } // Cachorro herda de Animal class Cachorro : Animal { // campos e métodos de Animal // campos e métodos de Cachorro }
Aqui, Cachorro estende Animal, ganhando acesso a seus membros. O diagrama abaixo ilustra a relação.

Exemplo: Herança Básica
using System; namespace Heranca { // Classe base class Animal { public string nome; public void Exibir() { Console.WriteLine("Sou um animal"); } } // Classe derivada class Cachorro : Animal { public void ObterNome() { Console.WriteLine("Meu nome é " + nome); } } class Program { static void Main(string[] args) { Cachorro labrador = new Cachorro(); labrador.nome = "Rohu"; labrador.Exibir(); labrador.ObterNome(); Console.ReadLine(); } } }
Saída
Sou um animal Meu nome é Rohu
Neste exemplo, Cachorro herda o campo nome e o método Exibir() de Animal. A classe derivada também pode adicionar seus próprios membros, como ObterNome().
A Relação "é-um"
Herança representa uma relação "é-um". Use-a quando uma classe logicamente é uma forma especializada de outra.
- Cachorro é um Animal
- Maçã é uma Fruta
- Carro é um Veículo
Essas relações justificam derivar Cachorro de Animal, Maçã de Fruta e Carro de Veículo.
Membros Protected na Herança
Quando um campo ou método é declarado protected, ele é acessível dentro de sua própria classe e todas as classes derivadas, mas oculto de código externo.
Exemplo: Usando Métodos Protected
using System; namespace Heranca { class Animal { protected void Comer() { Console.WriteLine("Posso comer"); } } class Cachorro : Animal { static void Main(string[] args) { Cachorro labrador = new Cachorro(); labrador.Comer(); Console.ReadLine(); } } }
Saída
Posso comer
Como Comer() é protected, a classe Cachorro pode invocá-lo, mas código fora da hierarquia não pode.
Tipos de Herança
Herança se manifesta em vários padrões:
1. Herança Simples
Uma única classe derivada herda de uma classe base.

2. Herança Multinível
Uma cadeia de herança onde uma classe herda de uma base, então outra classe herda dessa classe derivada.

3. Herança Hierárquica
Múltiplas classes derivadas compartilham a mesma classe base.

4. Herança Múltipla
Embora C# não suporte herdar de múltiplas classes, interfaces fornecem uma alternativa flexível para alcançar comportamento similar.

5. Herança Híbrida
Uma combinação de dois ou mais tipos de herança, como multinível mais hierárquica.

Sobrescrita de Métodos (Method Overriding)
Quando uma classe derivada declara um método com a mesma assinatura de um método da classe base marcado virtual, o método derivado pode sobrescrevê-lo usando override. Isso permite comportamento polimórfico.
using System; namespace Heranca { class Animal { public virtual void Comer() { Console.WriteLine("Como comida"); } } class Cachorro : Animal { public override void Comer() { Console.WriteLine("Como ração"); } } class Program { static void Main(string[] args) { Cachorro labrador = new Cachorro(); labrador.Comer(); } } }
Saída
Como ração
O método Comer() em Cachorro sobrescreve o de Animal. A palavra-chave virtual permite a sobrescrita, enquanto override sinaliza a substituição.
Usando a Palavra-chave base
Às vezes você precisa invocar a implementação da classe base de um método sobrescrito. A palavra-chave base facilita isso.
Exemplo: Chamando Métodos da Base
using System; namespace Heranca { class Animal { public virtual void Comer() { Console.WriteLine("Animais comem comida."); } } class Cachorro : Animal { public override void Comer() { base.Comer(); Console.WriteLine("Cachorros comem ração."); } } class Program { static void Main(string[] args) { Cachorro labrador = new Cachorro(); labrador.Comer(); } } }
Saída
Animais comem comida. Cachorros comem ração.
Aqui, base.Comer() chama a implementação de Animal antes de executar a lógica da classe derivada.
Por que Herança Importa em C#
Herança permite lógica reutilizável entre classes relacionadas. Considere formas geométricas onde cálculos de perímetro compartilham uma fórmula comum.
- Crie uma classe base PoligonoRegular com método CalcularPerimetro().
- Derive Quadrado e Retangulo dela, adicionando propriedades específicas como Comprimento e Lados.
- Cada classe derivada também pode implementar seu próprio cálculo de área enquanto reutiliza a lógica de perímetro.
Exemplo Ilustrativo
using System; namespace Heranca { class PoligonoRegular { public void CalcularPerimetro(int comprimento, int lados) { int resultado = comprimento * lados; Console.WriteLine("Perímetro: " + resultado); } } class Quadrado : PoligonoRegular { public int Comprimento = 200; public int Lados = 4; public void CalcularArea() { int area = Comprimento * Comprimento; Console.WriteLine("Área do Quadrado: " + area); } } class Retangulo : PoligonoRegular { public int Comprimento = 100; public int Largura = 200; public int Lados = 4; public void CalcularArea() { int area = Comprimento * Largura; Console.WriteLine("Área do Retângulo: " + area); } } class Program { static void Main(string[] args) { Quadrado q1 = new Quadrado(); q1.CalcularArea(); q1.CalcularPerimetro(q1.Comprimento, q1.Lados); Retangulo r1 = new Retangulo(); r1.CalcularArea(); r1.CalcularPerimetro(r1.Comprimento, r1.Lados); } } }
Saída
Área do Quadrado: 40000 Perímetro: 800 Área do Retângulo: 20000 Perímetro: 400
Este padrão ilustra como herança reduz duplicação e melhora manutenibilidade.
Linguagem C
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Entendendo Modificadores de Acesso em C#: Public, Private, Protected, Internal e Mais
- Palavra-chave Static em C#: Dominando Variáveis, Métodos e Classes Estáticas
- Dominando Classes e Métodos Abstratos em C#: Guia Prático
- Entendendo Classes Aninhadas em C#: Definição, Uso e Herança
- Entendendo Classes e Métodos Parciais em C#
- Dominando Classes e Métodos Sealed em C#: Quando Usar, Exemplos Claros e Segurança de Código
- Entendendo Polimorfismo em C++: Guia Prático
- Dominando Abstração de Dados em C++: Simplifique Design com Separação Interface-Implementação
- Entendendo a Estrutura de Programas C#: Componentes Essenciais e Exemplo