Sobes.tech
Middle
116
questionbank

Зачем нужны интерфейсы, если уже существуют абстрактные классы?

Ответ от нейросети

sobes.tech AI

  1. Множественное наследование. Класс может реализовывать несколько интерфейсов, но наследовать только от одного класса (включая абстрактные).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Наследует только от одного класса (object неявно)
    
    class FlyingCar : IDrivable, IFlyable {} // Реализует несколько интерфейсов
    
  2. Контракт без реализации. Интерфейсы определяют только контракт (методы, свойства, события, индексаторы) без какой-либо реализации. Абстрактные классы могут содержать частично реализованный функционал и поля.
    interface IShape
    {
        double GetArea(); // Только объявление
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Объявление
        public string Color { get; set; } // Реализация свойства
    
        public void DisplayColor()
        {
            Console.WriteLine($"Color: {Color}"); // Реализованный метод
        }
    }
    
  3. Слабое связывание (loose coupling). Интерфейсы способствуют слабой связанности между компонентами, так как код зависит от контракта, а не от конкретной реализации класса. Это облегчает замену одной реализации другой.
  4. Разделение ролей. Интерфейсы позволяют определить четкие роли или возможности, которыми должен обладать класс, независимо от его основного типа или иерархии наследования.
  5. Тестирование. Мокирование и стабы для модульного тестирования часто создаются на основе интерфейсов, а не абстрактных классов, поскольку абстрактные классы могут иметь зависимости или сложную внутреннюю логику.

Суммируя: интерфейсы предоставляют гибкий механизм для определения контрактов и достижения полиморфизма без ограничений наследования от единственного базового класса, тогда как абстрактные классы предназначены для предоставления частичной реализации и базового функционала, который будет дополнен в производных классах.