Ответ
Абстрактный класс в 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— без него никуда. - Может содержать и абстрактные методы (пустые, для галочки), и обычные (с готовой логикой, чтобы не париться в наследниках).
- Обязан быть унаследован — сам по себе он как манда с ушами, бесполезный.
- Абстрактные методы — это как долговые расписки: объявил в родителе, а расплачиваться (реализовывать) будешь в классе-ребёнке. Не расплатишься — получишь ошибку компиляции, и правильно, пизда тебе, а не программа.
Вот и весь сказ, ёпта. Удобная штука, когда нужно задать общую структуру, но детали оставить на потом.