Herança e Polimorfismo em C#: Um Guia Detalhado

C# 7 de Fev de 2024

Texto de Paulo Clemente
Desenvolvedor e redator de mídias sociais na Rocketseat

Herança e polimorfismo são pilares fundamentais da programação orientada a objetos (POO), essenciais para qualquer linguagem que suporte esse paradigma, incluindo C#.

Este guia detalhado, complementado por exemplos de código passo a passo, visa aprofundar a compreensão desses conceitos entre desenvolvedores.

Ao longo deste artigo, utilizaremos exemplos em C#, cuja sintaxe rigorosa e recursos avançados de POO fornecem uma base sólida para explorar herança e polimorfismo de maneira clara e eficaz.

Herança

A herança permite que você crie novas classes que reutilizam, estendem e modificam o comportamento definido em outras classes. A classe cujos membros são herdados é chamada classe base e a classe que herda esses membros é chamada classe derivada. Uma classe derivada pode ter apenas uma classe base direta. No entanto, a herança é transitiva. Se ClassC for derivado de ClassB e ClassB for derivado de ClassA, ClassC herdará os membros declarados em ClassB e ClassA.

Exemplo de Herança: Classes Veículo e Carro

Classe Base: Veículo

public class Veiculo
{
    public string Marca { get; set; }
    public string Modelo { get; set; }

    public Veiculo(string marca, string modelo)
    {
        Marca = marca;
        Modelo = modelo;
    }

    public virtual void MostrarDetalhes()
    {
        Console.WriteLine($"Marca: {Marca}, Modelo: {Modelo}");
    }
}

Aqui, Veiculo serve como classe base, definindo propriedades comuns e um método para exibir detalhes.

Classe Derivada: Carro

public class Carro : Veiculo
{
    public int Portas { get; set; }

    public Carro(string marca, string modelo, int portas) : base(marca, modelo)
    {
        Portas = portas;
    }

    public override void MostrarDetalhes()
    {
        base.MostrarDetalhes();
        Console.WriteLine($"Portas: {Portas}");
    }
}

A classe Carro herda de Veiculo, estendendo-a com uma nova propriedade e sobrescrevendo o método para incluir detalhes adicionais.

Polimorfismo

Polimorfismo é um princípio em programação orientada a objetos que permite que objetos de diferentes classes sejam tratados como se fossem objetos de uma única classe base. O termo vem do grego e significa "muitas formas". Isso é útil em duas situações principais:

  1. Tratamento Uniforme: Você pode usar objetos de qualquer classe derivada (ou seja, classes que herdam de uma classe base) como se fossem objetos da classe base. Isso é muito útil para escrever código genérico que funciona com uma variedade de tipos de objetos. Por exemplo, se você tem uma função que aceita objetos da classe base como parâmetros, você pode passar objetos de qualquer classe derivada para essa função.
  2. Comportamento Específico: Classes derivadas podem modificar ou estender o comportamento de métodos herdados da classe base. Isso é feito através de dois conceitos importantes:
  • Métodos Virtuais: São métodos na classe base que são declarados com a palavra-chave virtual. Isso indica que o método pode ser modificado por classes derivadas.
public virtual void MostrarDetalhes()
{
    Console.WriteLine($"Marca: {Marca}, Modelo: {Modelo}");
}
  • Substituição de Métodos: Classes derivadas podem usar a palavra-chave override para fornecer sua própria versão de um método virtual, alterando ou estendendo o comportamento original definido pela classe base.
public override void MostrarDetalhes()
{
   base.MostrarDetalhes(); // Chama a implementação base
   Console.WriteLine($"Cilindradas: {Cilindradas}");
}

Exemplo de Polimorfismo: Classes Veículo, Carro e Moto

public class Program
{
    public static void Main()
    {
        Veiculo meuCarro = new Carro("Ford", "Fusion", 4);
        Veiculo minhaMoto = new Moto("Honda", "CBR", 650);

        MostrarInformacoesVeiculo(meuCarro);
        MostrarInformacoesVeiculo(minhaMoto);
    }

    public static void MostrarInformacoesVeiculo(Veiculo veiculo)
    {
        veiculo.MostrarDetalhes();
    }
}

Neste exemplo, meuCarro e minhaMoto são instâncias de Carro e Moto, respectivamente, mas ambos são tratados como Veiculo. Quando MostrarInformacoesVeiculo é chamado com esses objetos, o método MostrarDetalhes correspondente à classe real do objeto é invocado, demonstrando polimorfismo. Isso permite que meuCarro mostre detalhes específicos do carro, como o número de portas, e minhaMoto mostre as cilindradas, apesar de ambos serem tratados como Veiculo.

Função Polimórfica

public void MostrarInformacoesVeiculo(Veiculo veiculo)
{
    veiculo.MostrarDetalhes();
}

Esta função aceita qualquer objeto do tipo Veiculo ou suas subclasses, demonstrando polimorfismo ao invocar MostrarDetalhes, que pode variar conforme a classe do objeto.

Herança e polimorfismo são essenciais na POO, oferecendo reutilização de código e flexibilidade. Em C#, esses conceitos permitem a extensão e especialização de classes, além de facilitar a interação com objetos de diferentes classes de maneira unificada.

Marcadores