Middle
За какво са нужни интерфейсите, ако вече съществуват абстрактни класове?
sobes.tech AI
Отговор от AI
- Множествено наследяване. Клас може да реализира няколко интерфейса, но да наследява само от един клас (включително абстрактни).
interface IDrivable {} interface IFlyable {} class Car : IDrivable {} // Наследява само от един клас (object неявно) class FlyingCar : IDrivable, IFlyable {} // Реализира няколко интерфейса - Договор без реализация. Интерфейсите определят само договор (методи, свойства, събития, индексатори) без каквато и да е реализация. Абстрактните класове могат да съдържат частично реализирана функционалност и полета.
interface IShape { double GetArea(); // Само декларация } abstract class Shape { public abstract double GetArea(); // Декларация public string Color { get; set; } // Реализация на свойство public void DisplayColor() { Console.WriteLine($"Цвят: {Color}"); // Реализиран метод } } - Слабо свързване (loose coupling). Интерфейсите насърчават слабо свързване между компонентите, тъй като кодът зависи от договора, а не от конкретната реализация на класа. Това улеснява замяната на една реализация с друга.
- Разделяне на роли. Интерфейсите позволяват да се определят ясни роли или възможности, които трябва да притежава даден клас, независимо от неговия основен тип или йерархия на наследяване.
- Тестване. Моковете и стабовете за модулно тестване често се създават въз основа на интерфейси, а не на абстрактни класове, тъй като те могат да имат зависимости или сложна вътрешна логика.
Обобщено: интерфейсите предоставят гъвкав механизъм за определяне на договори и постигане на полиморфизъм без ограниченията на наследяването от един базов клас, докато абстрактните класове са предназначени да предоставят частична реализация и основен функционал, който ще бъде допълнен в производните класове.