Sobes.tech
Middle

Em que casos deve usar uma interface e em quais uma classe abstrata?

sobes.tech IA

Resposta da IA

Utilize interfaces para definir contratos de comportamento que as classes podem implementar. Isto permite alcançar polimorfismo e reduzir o acoplamento entre classes. Uma classe pode ter múltiplas interfaces, mas apenas uma classe base.

Utilize classes abstratas quando tiver uma implementação comum de parte da funcionalidade e desejar fornecer uma estrutura base para classes derivadas. As classes abstratas podem conter métodos abstratos e normais, bem como campos. São adequadas quando é necessária herança "é".

Característica Interface Classe abstrata
Herança múltipla Sim Não
Implementação Não (até ao .NET 8 com métodos de interface padrão) Sim, parcial ou completa
Campos Não Sim
Construtores Não Sim
Tipo de relação "pode fazer" ("has-a") "é" ("is-a")

Exemplo de uso de interface:

// Definir um contrato para objetos que podem voar
public interface IFlyable
{
    void Fly();
}

// A classe avião implementa a interface IFlyable
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Implementação do voo do avião
        Console.WriteLine("O avião voa");
    }
}

// A classe pássaro também implementa a interface IFlyable
public class Bird : IFlyable
{
    public void Fly()
    {
        // Implementação do voo do pássaro
        Console.WriteLine("O pássaro voa");
    }
}

Exemplo de uso de classe abstrata:

// Classe abstrata Animal com implementação comum de respiração
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("O animal respira");
    }

    // Método abstrato que deve ser implementado pelas classes derivadas
    public abstract void MakeSound();
}

// Classe concreta de cão que herda de Animal
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Au!");
    }
}

// Classe concreta de gato que herda de Animal
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Miau!");
    }
}