Sobes.tech
Назад к вопросам
Junior — Middle
58

Какое основное отличие между абстрактным классом и интерфейсом в объектно-ориентированном программировании?

Компании, где спрашивали
AstonAston
appfox

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

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

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

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

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

Абстрактный класс удобно использовать для общей логики животных: у всех есть имя и способ издавать звук, но детали разные. Интерфейс подходит для поведения вроде "умеет летать" или "может логироваться", которое могут реализовать разные, не связанные между собой классы.

public abstract class Animal
{
    public string Name { get; set; }

    public void Sleep()
    {
        Console.WriteLine($"{Name} спит");
    }

    public abstract void MakeSound();
}

public interface IFlyable
{
    void Fly();
}

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

public class Bird : Animal, IFlyable
{
    public override void MakeSound()
    {
        Console.WriteLine("Чирик");
    }

    public void Fly()
    {
        Console.WriteLine("Птица летит");
    }
}

Пояснение кода:

В примере Animal — абстрактный класс: он хранит общее свойство Name и общий метод Sleep(), который уже реализован. Метод MakeSound() объявлен как абстрактный, поэтому каждый наследник обязан дать свою реализацию.

Dog наследуется от Animal и реализует только MakeSound(). Bird тоже наследуется от Animal, но дополнительно реализует интерфейс IFlyable, потому что умение летать — это отдельное поведение, которое можно использовать и в других классах.

Если нужен только контракт, выбирают интерфейс. Если нужна общая база с частичной реализацией, выбирают абстрактный класс.

Ключевые моменты:

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