🎯 Objetivo: Neste capítulo, vamos mergulhar nas Classes Abstratas, uma ferramenta fundamental na Programação Orientada a Objetos para criar hierarquias de classes mais flexíveis e organizadas. Elas nos permitem definir um "projeto" de classes que ainda não está completo, mas que serve de base para outras classes mais específicas.


🧩 O que são Classes Abstratas?

Imagine que você está projetando uma nova linha de veículos. Você sabe que todos os veículos terão certas características (como cor, velocidade máxima) e certas ações (como ligar o motor, frear). No entanto, faz sentido criar um "Veículo Genérico" que você possa dirigir? Provavelmente não. Você quer dirigir um Carro, uma Moto, ou um Caminhao.

Uma Classe Abstrata é exatamente isso: um projeto ou um modelo para outras classes, mas que não pode ser instanciada diretamente. Ela serve como uma base, uma ideia geral que precisa ser complementada por outras classes mais específicas.

Ponto Chave: Você não pode criar um objeto de uma classe abstrata. Ela existe apenas para ser estendida (herdada) por outras classes.

<aside> 💡

Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela serve como um modelo geral para outras classes mais específicas.

</aside>

✔️ Classes abstratas podem conter:


❓ Por Que Usar Classes Abstratas?

Elas permitem:


🗜️ Componentes de uma Classe Abstrata

Uma classe abstrata pode conter:


🧪 Exemplo Prático: Desenhando Formas Geométricas

Vamos pensar em diversas formas geométricas: Circulo, Retangulo, Triangulo. Todas elas são "formas" e todas podem ser "desenhadas" e "exibidas". No entanto, não faz sentido ter uma "Forma Genérica" que possa ser desenhada por si só, sem saber se é um círculo ou um quadrado.

// Declaração de uma Classe Abstrata
public abstract class Forma
{
    // Atributo comum a todas as formas
    public string Cor { get; set; }

    // Construtor (classes abstratas podem ter construtores)
    public Forma(string cor)
    {
        Cor = cor;
    }

    // Método abstrato: Cada forma se desenha de um jeito,
    // então a implementação é deixada para as classes derivadas.
    public abstract void Desenhar(); // Não tem corpo, termina com ';'

    // Método concreto: Todas as formas podem exibir suas informações de forma similar.
    public void ExibirInformacoes()
    {
        Console.WriteLine($"Cor da forma: {Cor}");
    }
}

Neste exemplo: