Da trilha de C# Este conceito ainda não saiu como card do dia. ir para o card de hoje

C# POO Básico

Herança e polimorfismo

Em C#, herança permite que uma classe reutilize membros de outra, criando uma relação "é um". A classe base define comportamentos comuns, e a derivada pode especializá-los. Já o polimorfismo permite tratar objetos de classes derivadas como se fossem da classe base, chamando métodos que se comportam de forma diferente conforme o tipo real.

Para que um método possa ser sobrescrito, ele precisa ser marcado como virtual na classe base e override na derivada. Classes e membros abstract estabelecem um contrato que as classes derivadas devem implementar, sem fornecer uma implementação padrão. Já sealed impede que uma classe seja herdada ou que um método sobrescrito seja novamente sobrescrito.

Esses recursos formam a base do design orientado a objetos em C#, permitindo código flexível, extensível e fácil de manter. Neste card, você verá exemplos práticos de cada um e como combiná-los.

Pontos-chave

  • Herança usa : para indicar que uma classe deriva de outra.
  • virtual permite sobrescrever um método; override implementa a sobrescrita.
  • abstract define membros sem implementação que devem ser sobrescritos.
  • sealed impede herança adicional ou sobrescrita de um método.
  • Polimorfismo permite chamar o método correto em tempo de execução via referência da base.
HerancaPolimorfismo.cs
using System;

abstract class Animal
{
    public string Nome { get; set; }
    public Animal(string nome) => Nome = nome;

    // Método abstrato: obrigatório nas classes derivadas
    public abstract void EmitirSom();

    // Método virtual: pode ser sobrescrito, mas tem padrão
    public virtual void Apresentar()
    {
        Console.WriteLine($"Olá, eu sou {Nome}.");
    }
}

class Cachorro : Animal
{
    public Cachorro(string nome) : base(nome) { }

    public override void EmitirSom() => Console.WriteLine("Woof!");
}

class Gato : Animal
{
    public Gato(string nome) : base(nome) { }

    public override void EmitirSom() => Console.WriteLine("Miau!");

    // Sobrescreve o método virtual
    public override void Apresentar()
    {
        Console.WriteLine($"Eu sou o gato {Nome}.");
    }
}

// Classe sealed: não pode ser herdada
sealed class Passaro : Animal
{
    public Passaro(string nome) : base(nome) { }
    public override void EmitirSom() => Console.WriteLine("Piu!");
}

class Program
{
    static void Main()
    {
        Animal[] animais = { new Cachorro("Rex"), new Gato("Mimi"), new Passaro("Piu") };

        foreach (var animal in animais)
        {
            animal.Apresentar();
            animal.EmitirSom();
            Console.WriteLine();
        }
    }
}

Exercícios

  1. 1
    Fácil

    Formas geométricas

    Crie uma classe base Forma com um método virtual double CalcularArea() que retorna 0. Depois, crie as classes Retangulo e Circulo que herdam de Forma e sobrescrevem CalcularArea com as fórmulas corretas. No Main, crie um array de Forma com um retângulo e um círculo e exiba a área de cada um.

    Resolver
  2. 2
    Médio

    Funcionários com bônus

    Crie uma classe abstrata Funcionario com propriedades Nome e SalarioBase, e um método abstrato CalcularSalario(). Crie as classes Gerente e Desenvolvedor que herdam de Funcionario. O gerente recebe um bônus de 20% sobre o salário base; o desenvolvedor recebe um bônus de 10%. No Main, crie uma lista de Funcionario e exiba o nome e o salário final de cada um.

    Resolver
  3. 3
    Desafio

    Veículos e classes seladas

    Modele uma hierarquia de veículos: uma classe abstrata Veiculo com propriedades Marca e Modelo, e um método abstrato Descricao(). Crie as classes Carro e Moto que herdam de Veiculo e implementam Descricao. Depois, crie uma classe CarroEletrico que herda de Carro e sobrescreve Descricao para incluir a autonomia da bateria. Torne CarroEletrico selada (sealed) para que não possa ser herdada. No Main, crie uma lista de Veiculo e exiba a descrição de cada um.

    Resolver

Continue estudando