В чем разница между абстрактным классом и интерфейсом?
Классы
Абстрактный класс — это частично реализованный класс, который нельзя инстанцировать, а интерфейс — только описание контракта (без реализации). В TypeScript они решают разные задачи.
Абстрактный класс
- Может содержать и реализацию, и абстрактные методы (без тела).
- Нельзя создать напрямую (
new) — только через наследника. - Наследник обязан реализовать абстрактные методы.
- Существует в рантайме (это класс).
abstract class Shape {
abstract area(): number; // без реализации
describe() { // с реализацией
return `Площадь: ${this.area()}`;
}
}
class Circle extends Shape {
constructor(private r: number) { super(); }
area() { return Math.PI * this.r ** 2; }
}Интерфейс
- Только описание структуры/контракта, без реализации.
- Существует только на этапе компиляции (в рантайме его нет).
- Класс может реализовать несколько интерфейсов.
interface Drawable {
draw(): void;
}
class Button implements Drawable {
draw() {}
}Различия
- Реализация: абстрактный класс может иметь код; интерфейс — нет.
- Множественность: интерфейсов можно реализовать много, класс наследуют один.
- Рантайм: класс есть в рантайме, интерфейс исчезает после компиляции.
- Наследование состояния: абстрактный класс может иметь поля/конструктор.
Коротко для собеседования
Абстрактный класс — частичная реализация + абстрактные методы, нельзя инстанцировать, есть в рантайме, наследуется один. Интерфейс — чистый контракт без реализации, только на этапе компиляции, реализуемых интерфейсов может быть много. Класс — для общего кода, интерфейс — для описания формы.