Что такое Abstract Class в TypeScript

Ответ

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

abstract class Animal {
  abstract makeSound(): void;

  move(): void {
    console.log("Moving...");
  }
}

class Dog extends Animal {
  makeSound() {
    console.log("Woof!");
  }
}

const dog = new Dog();
dog.makeSound(); // "Woof!"
dog.move(); // "Moving..."

Ключевые особенности:

  • Создается с ключевым словом abstract
  • Может содержать как абстрактные, так и обычные методы
  • Обязателен для наследования
  • Абстрактные методы не имеют тела и должны быть реализованы в наследниках

Ответ 18+ 🔞

Ну ты смотри, какой прикол придумали в TypeScript — абстрактный класс! Это как такой начальник-теоретик, который сам нихуя не делает, но всем раздаёт указания. Объявляешь его через abstract, и бац — инстанциировать его напрямую уже нельзя, то есть создать экземпляр — хуй тебе, а не объект. Он существует только для того, чтобы от него другие классы наследовались, как этакий шаблон, свод правил, блядь.

Смотри, как это выглядит, вот реальный пример:

abstract class Animal {
  abstract makeSound(): void; // А вот это, сука, абстрактный метод — объявили, но нихуя не реализовали!

  move(): void { // А это уже обычный метод, с телом, его можно сразу использовать
    console.log("Moving...");
  }
}

Видишь? makeSound() — это просто заголовок, обещание, что такой метод будет. А как именно он будет работать — это уже проблема тех, кто этот класс унаследует. Как будто сказал: «Сынок, иди купи хлеб», а как купить, где магазин, на какие деньги — это уже твои ебушки-воробушки.

А вот когда создаём нормальный, не абстрактный класс-наследник, тут уже надо всё по-честному:

class Dog extends Animal {
  makeSound() { // Здесь уже обязаны дать реализацию, иначе компилятор наорет, как сука
    console.log("Woof!");
  }
}

const dog = new Dog(); // А вот так уже можно, потому что Dog — конкретный
dog.makeSound(); // "Woof!"
dog.move(); // "Moving..." // И метод move() тоже подтянулся от родителя, готовенький!

Короче, фишка в чём:

  • Создаётся с этим самым словом abstract — без него никуда.
  • Может содержать и абстрактные методы (пустые, для галочки), и обычные (с готовой логикой, чтобы не париться в наследниках).
  • Обязан быть унаследован — сам по себе он как манда с ушами, бесполезный.
  • Абстрактные методы — это как долговые расписки: объявил в родителе, а расплачиваться (реализовывать) будешь в классе-ребёнке. Не расплатишься — получишь ошибку компиляции, и правильно, пизда тебе, а не программа.

Вот и весь сказ, ёпта. Удобная штука, когда нужно задать общую структуру, но детали оставить на потом.