PassFront
  1. PassFront
  2. База знаний
  3. Классы

В чем разница между абстрактным классом и интерфейсом?

Классы

Абстрактный класс — это частично реализованный класс, который нельзя инстанцировать, а интерфейс — только описание контракта (без реализации). В 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() {}
}

Различия

  • Реализация: абстрактный класс может иметь код; интерфейс — нет.
  • Множественность: интерфейсов можно реализовать много, класс наследуют один.
  • Рантайм: класс есть в рантайме, интерфейс исчезает после компиляции.
  • Наследование состояния: абстрактный класс может иметь поля/конструктор.

Коротко для собеседования

Абстрактный класс — частичная реализация + абстрактные методы, нельзя инстанцировать, есть в рантайме, наследуется один. Интерфейс — чистый контракт без реализации, только на этапе компиляции, реализуемых интерфейсов может быть много. Класс — для общего кода, интерфейс — для описания формы.

Другие вопросы раздела