Middle
116
questionbank
Зачем нужны интерфейсы, если уже существуют абстрактные классы?
Ответ от нейросети
sobes.tech 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: {Color}"); // Реализованный метод } } - Слабое связывание (loose coupling). Интерфейсы способствуют слабой связанности между компонентами, так как код зависит от контракта, а не от конкретной реализации класса. Это облегчает замену одной реализации другой.
- Разделение ролей. Интерфейсы позволяют определить четкие роли или возможности, которыми должен обладать класс, независимо от его основного типа или иерархии наследования.
- Тестирование. Мокирование и стабы для модульного тестирования часто создаются на основе интерфейсов, а не абстрактных классов, поскольку абстрактные классы могут иметь зависимости или сложную внутреннюю логику.
Суммируя: интерфейсы предоставляют гибкий механизм для определения контрактов и достижения полиморфизма без ограничений наследования от единственного базового класса, тогда как абстрактные классы предназначены для предоставления частичной реализации и базового функционала, который будет дополнен в производных классах.