Sobes.tech
Middle

Para que servem as interfaces se já existem classes abstratas?

sobes.tech IA

Resposta da IA

  1. Herança múltipla. Uma classe pode implementar várias interfaces, mas herdar apenas de uma classe (incluindo abstratas).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Herda apenas de uma classe (object implicitamente)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementa várias interfaces
    
  2. Contrato sem implementação. As interfaces definem apenas um contrato (métodos, propriedades, eventos, indexadores) sem qualquer implementação. As classes abstratas podem conter funcionalidade parcialmente implementada e campos.
    interface IShape
    {
        double GetArea(); // Apenas declaração
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Declaração
        public string Color { get; set; } // Implementação da propriedade
    
        public void DisplayColor()
        {
            Console.WriteLine($"Cor: {Color}"); // Método implementado
        }
    }
    
  3. Acoplamento fraco (loose coupling). Interfaces promovem um acoplamento fraco entre componentes, pois o código depende do contrato, não da implementação concreta. Isso facilita a substituição de uma implementação por outra.
  4. Separação de papéis. Interfaces permitem definir papéis ou capacidades claras que uma classe deve possuir, independentemente do seu tipo principal ou hierarquia de herança.
  5. Testes. Mocks e stubs para testes unitários são frequentemente criados com base em interfaces, não em classes abstratas, pois estas podem ter dependências ou lógica interna complexa.

Resumindo: interfaces fornecem um mecanismo flexível para definir contratos e alcançar polimorfismo sem as restrições de herança de uma única classe base, enquanto classes abstratas destinam-se a fornecer implementação parcial e funcionalidade básica, que será complementada em classes derivadas.