Ответ вслух Middle Классы и интерфейсы обновлено

Абстрактный класс или интерфейс

Вопрос

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

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

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

Что должно прозвучать в ответе

  • Интерфейс это только контракт, исчезает при компиляции

  • Абстрактный класс даёт общую реализацию, состояние и конструктор, остаётся в рантайме

  • Класс наследует один класс, но реализует много интерфейсов

  • На интерфейсы удобно подменять реализации в тестах и DI

  • Наследование связывает жёстче, часто лучше композиция плюс интерфейс

Что могут спросить следом

  • Можно ли проверить instanceof по интерфейсу?
  • Где в NestJS используют абстрактные классы как токены?
  • Что такое шаблонный метод?

Разбор

Интерфейс описывает только контракт: какие методы и поля есть у объекта. При компиляции он исчезает, поэтому по нему нельзя сделать instanceof, зато класс может реализовать сколько угодно интерфейсов, а в тестах реализацию легко подменить. Абстрактный класс нужен, когда у наследников есть общая реализация или состояние: например, шаблонный метод, где базовый класс задаёт алгоритм, а наследники реализуют шаги. Он остаётся в рантайме, поэтому в NestJS абстрактный класс удобно использовать как токен для внедрения зависимостей. Но наследоваться можно только от одного класса, и иерархии быстро становятся жёсткими. Поэтому по умолчанию я беру интерфейс и композицию, а абстрактный класс, только когда общая логика действительно должна жить в базе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.