Middle
Para que servem as interfaces se já existem classes abstratas?
sobes.tech IA
Resposta da IA
- 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 - 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 } } - 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.
- 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.
- 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.