Разница между абстрактным классом и интерфейсом в C#

Абстрактные классы и интерфейсы являются фундаментальными концепциями объектно-ориентированного программирования в C#. Они оба используются для определения контракта, который должны соблюдать производные классы, но между ними существуют значительные различия.

Абстрактный класс – это класс, который может содержать как объявленные, так и реализованные методы, но не может быть создан в виде экземпляра.

Интерфейс – это контракт, который определяет только сигнатуры методов и свойств, не имея собственной реализации (до C# 8.0).

Примеры использования

Абстрактный класс

abstract class Animal
{
    public abstract void MakeSound();
    public void Sleep()
    {
        Console.WriteLine("Sleeping...");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks");
    }
}

В данном примере класс Animal является абстрактным и содержит метод MakeSound(), который должен быть реализован в производных классах.

Интерфейс

interface IShape
{
    void Draw();
}

class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

Здесь интерфейс IShape определяет метод Draw(), который обязан реализовать каждый класс, использующий этот интерфейс.

Когда использовать абстрактный класс, а когда интерфейс?

  • Используйте абстрактный класс, если у вас есть частичная реализация методов или общий функционал, который должен наследоваться всеми подклассами.
  • Используйте интерфейс, если требуется задать контракт для нескольких несвязанных классов, а реализация остаётся за каждым из них.