Skip to main content

Classe Abstrata e Interface | Artigo .NET

  • Classe Abstrata e Interface | Artigo .NET

Em C#, tanto classes abstratas quanto interfaces são usadas para definir contratos que outras classes podem implementar, mas existem diferenças significativas entre elas, tanto no uso quanto nas funcionalidades que oferecem. Aqui estão as principais diferenças:

1. Herança Múltipla

  • Interface: Permite herança múltipla. Uma classe pode implementar várias interfaces ao mesmo tempo. Isso é útil quando se quer combinar funcionalidades de diferentes fontes, já que o C# não permite herança múltipla de classes.
  • Classe Abstrata: Não permite herança múltipla. Uma classe só pode herdar de uma única classe abstrata (ou qualquer outra classe), mas pode implementar várias interfaces.

2. Implementação de Métodos

  • Interface: Não permite implementar métodos diretamente (até o C# 8.0). A interface define apenas a assinatura dos métodos, sem conteúdo. A partir do C# 8.0, as interfaces podem ter métodos com implementação padrão (default implementation), mas isso ainda é uma exceção e usado apenas em alguns cenários específicos.
  • Classe Abstrata: Pode ter métodos abstratos (sem implementação) e métodos concretos (com implementação). Isso permite que a classe abstrata forneça uma implementação padrão para alguns métodos, enquanto força a implementação de outros pelos herdeiros.

3. Campos e Propriedades

  • Interface: Não permite definir campos (variáveis de instância), apenas propriedades. Assim, a interface não pode armazenar estado.
  • Classe Abstrata: Pode ter campos, propriedades, construtores e métodos com implementação. Isso permite que uma classe abstrata mantenha um estado, que pode ser compartilhado entre os métodos e acessado ou modificado pelas subclasses.

4. Uso de Modificadores de Acesso

  • Interface: Os membros de uma interface são, por padrão, públicos, e não é permitido usar modificadores de acesso como private ou protected.
  • Classe Abstrata: Permite o uso de modificadores de acesso, como public, protected, internal, e private, tanto para métodos quanto para propriedades, o que oferece mais controle sobre a visibilidade dos membros.

5. Construtores

  • Interface: Não pode ter construtores. As interfaces não têm uma implementação que possa ser instanciada, então um construtor não faz sentido nesse contexto.
  • Classe Abstrata: Pode ter construtores. Embora uma classe abstrata não possa ser instanciada diretamente, ela pode usar construtores para inicializar seus próprios campos quando é herdada por uma classe concreta.

6. Uso e Intenção

  • Interface: É usada para definir um contrato que múltiplas classes podem implementar de forma independente, o que promove um design orientado a contratos. Interfaces são ideais para representar funcionalidades e comportamentos que podem ser compartilhados entre tipos que não têm uma relação de herança.
  • Classe Abstrata: É usada para representar uma relação de herança entre classes. Uma classe abstrata é mais adequada quando existe uma relação "é um tipo de" entre a classe base e suas subclasses, ou quando se deseja compartilhar uma implementação parcial entre as subclasses.

Exemplo de Interface

public interface IAnimal
{
void Comer();
void Dormir();
}

Exemplo de Classe Abstrata

public abstract class Animal
{
public void Dormir() // Método concreto
{
Console.WriteLine("Dormindo...");
}

public abstract void Comer(); // Método abstrato
}

Quando Usar Qual?

  • Use uma interface quando você quer definir apenas um contrato comum, sem comportamento padrão ou estado compartilhado.
  • Use uma classe abstrata quando você quer fornecer alguma implementação comum para suas subclasses ou precisa manter um estado que será compartilhado por todas elas.

Essas diferenças permitem ao C# combinar interfaces e classes abstratas de forma flexível, proporcionando opções para estruturar sistemas de acordo com as necessidades de cada cenário.