Sobes.tech
Назад к вопросам
Senior
10

Расскажи про интерфейсы и абстрактные классы: когда применять одно, когда другое, и особенности наследования

Компании, где спрашивали
Позитив Технолоджис

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

sobes.tech AI

Интерфейсы и абстрактные классы — это инструменты для описания контрактов и базового поведения в объектно-ориентированном программировании, но они имеют разные цели и особенности.

Интерфейсы:

  • Определяют только сигнатуры методов и свойств, без реализации.
  • Используются для задания обязательного набора методов, которые класс должен реализовать.
  • Позволяют реализовать множественное наследование контрактов (в языках, где это поддерживается).
  • Хорошо подходят для описания ролей или возможностей, которые могут быть реализованы разными классами.

Абстрактные классы:

  • Могут содержать как абстрактные методы (без реализации), так и конкретные методы с реализацией.
  • Используются для создания базового класса с общим поведением и обязательными методами для наследников.
  • Поддерживают наследование реализации и состояние (поля).
  • Обычно применяются, когда есть общая логика, которую нужно разделить между классами.

Когда применять:

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

Особенности наследования:

  • Класс может реализовывать несколько интерфейсов.
  • Класс может наследоваться только от одного абстрактного класса (в большинстве языков).

Пример на C#:

interface ILogger
{
    void Log(string message);
}

abstract class BaseLogger : ILogger
{
    public abstract void Log(string message);
    public void LogError(string error) {
        Log("ERROR: " + error);
    }
}

class ConsoleLogger : BaseLogger
{
    public override void Log(string message) {
        Console.WriteLine(message);
    }
}

Здесь интерфейс задаёт контракт, абстрактный класс даёт частичную реализацию, а конкретный класс реализует детали.