Абстрактный класс или интерфейс
Вопрос
Когда вы выберете абстрактный класс, а когда интерфейс?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Интерфейс это только контракт, исчезает при компиляции
Абстрактный класс даёт общую реализацию, состояние и конструктор, остаётся в рантайме
Класс наследует один класс, но реализует много интерфейсов
На интерфейсы удобно подменять реализации в тестах и DI
Наследование связывает жёстче, часто лучше композиция плюс интерфейс
Что могут спросить следом
- Можно ли проверить
instanceofпо интерфейсу? - Где в NestJS используют абстрактные классы как токены?
- Что такое шаблонный метод?
Разбор
Интерфейс описывает только контракт: какие методы и поля есть у объекта. При компиляции он исчезает, поэтому по нему нельзя сделать instanceof, зато класс может реализовать сколько угодно интерфейсов, а в тестах реализацию легко подменить. Абстрактный класс нужен, когда у наследников есть общая реализация или состояние: например, шаблонный метод, где базовый класс задаёт алгоритм, а наследники реализуют шаги. Он остаётся в рантайме, поэтому в NestJS абстрактный класс удобно использовать как токен для внедрения зависимостей. Но наследоваться можно только от одного класса, и иерархии быстро становятся жёсткими. Поэтому по умолчанию я беру интерфейс и композицию, а абстрактный класс, только когда общая логика действительно должна жить в базе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.