Абстрактные классы в TypeScript — это классы-шаблоны, которые нельзя создать напрямую через new. Они задают контракт для дочерних классов: какие методы обязательно нужно реализовать.
Ключевые особенности:
- Объявляются через
abstract class - Могут содержать обычные методы с реализацией
- Абстрактные методы помечаются
abstractи не имеют тела - Дочерний класс обязан реализовать все абстрактные методы
Это мощный инструмент для проектирования иерархий классов, когда нужна общая логика плюс обязательные точки расширения.
В заданиях ниже вы попрактикуетесь в создании и использовании абстрактных классов на реальных примерах.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Объяви абстрактный класс
В этом задании вам нужно объявить абстрактный класс Shape с абстрактным методом getArea(). Заполните пропуски в приведённом фрагменте кода на TypeScript, вставив ключевые слова abstract в нужные места. Обратите внимание, что абстрактный класс не может быть инстанциирован напрямую, а абстрактный метод не имеет реализации и должен быть реализован в классах-наследниках.
// Объяви абстрактный класс Shape
input1S class Shape {
// Объяви абстрактный метод getArea, который возвращает число
input2S getArea(): number;
// Обычный метод для вывода информации
printInfo(): void {
console.log('Это фигура');
}
}2. Собери абстрактный класс и наследника
Из предложенных строк соберите корректную TypeScript-программу, которая определяет абстрактный класс Animal с абстрактным методом speak() и класс Dog, наследующий Animal и реализующий этот метод. Одна из строк лишняя и в решение входить не должна — это попытка создать экземпляр абстрактного класса.
abstract class Animal { abstract speak(): void;}class Dog extends Animal { speak(): void { console.log("Woof!"); }}const a = new Animal();3. Нельзя создать экземпляр
В приведённом фрагменте кода TypeScript допущена ошибка, из-за которой программа не сможет выполниться. Найдите строку, в которой происходит попытка создать экземпляр абстрактного класса, и исправьте её, чтобы код работал корректно.
abstract class Animal { abstract makeSound(): void;} class Dog extends Animal { makeSound() { console.log("Woof!"); }} const myPet = new Animal();myPet.makeSound();4. Что выведет код?
Проанализируйте приведённый код на TypeScript, включающий абстрактный класс Animal с обычным методом makeSound и абстрактным методом move, а также класс Dog, который наследует Animal и реализует абстрактный метод move. В конце кода создаётся экземпляр класса Dog и вызывается метод move, результат которого выводится в консоль. Выберите, что будет выведено в консоль после выполнения этого кода.
abstract class Animal {
protected name: string;
constructor(name: string) {
this.name = name;
}
// обычный метод
public makeSound(): string {
return `Some sound from ${this.name}`;
}
// абстрактный метод
abstract move(): string;
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
public move(): string {
return `${this.name} runs`;
}
}
const dog = new Dog("Rex");
console.log(dog.move());5. Абстрактное vs обычное
Сопоставьте элементы левой колонки (ключевые понятия TypeScript, связанные с абстрактными классами) с соответствующими описаниями в правой колонке. Обратите внимание, что в правой колонке описания перемешаны, и каждому термину соответствует ровно одно определение.
abstract classabstract methodextendsimplementsconcrete method in abstract class6. Найди абстрактные методы
Внимательно изучите приведённый код абстрактного класса на TypeScript. Ваша задача — найти и отметить кликом все абстрактные методы. Абстрактные методы объявляются с ключевым словом `abstract`, не имеют реализации (тела) в абстрактном классе и заканчиваются точкой с запятой. Не отмечайте обычные методы (с реализацией), конструктор, поля класса или другие элементы кода.
abstract class DataProcessor {
protected data: string;
constructor(initialData: string) {
this.data = initialData;
}
{{abstract validate(): boolean;~|~t1}}
{{process(): void {~|~t2}
if (this.validate()) {
console.log("Processing data:", this.data);
}
}}
{{abstract transform(): string;~|~t3}}
{{logResult(): void {~|~t4}
const result = this.transform();
console.log("Result:", result);
}}
}7. Выбери модификаторы
В данном фрагменте кода TypeScript представлен абстрактный класс с пропусками перед ключевыми словами. Вам необходимо выбрать из выпадающего списка подходящие модификаторы доступа и спецификаторы (abstract, public, private, protected, static), чтобы код стал синтаксически и семантически корректным. Обратите внимание на правила использования модификаторов в абстрактных классах и методах.
input1S class Animal {
input2S name: string;
input3S constructor(name: string) {
this.name = name;
}
input4S makeSound(): void;
input5S getInfo(): string {
return `This animal is called ${this.name}`;
}
}8. Порядок объявлений
Перед вами строки кода TypeScript, описывающие создание иерархии классов с использованием абстрактного класса. Они перемешаны. Расставьте строки в правильном порядке, чтобы получился корректный код, который объявляет абстрактный класс с абстрактным методом, создаёт класс-наследник, реализующий этот метод, и создаёт экземпляр класса-наследника. Код должен быть синтаксически корректным и компилироваться без ошибок.
}const myDog = new Dog();}abstract class Animal { makeSound() { console.log("Woof!"); }class Dog extends Animal { abstract makeSound(): void;9. Сколько методов нужно реализовать
Рассмотрите приведённый фрагмент кода на TypeScript, в котором определён абстрактный класс с несколькими методами. Ваша задача — определить, сколько методов обязан реализовать класс-наследник, чтобы корректно расширить абстрактный класс. Введите одно число — количество методов, которые нужно реализовать.
abstract class Animal {
abstract makeSound(): void;
abstract move(): void;
eat(): void {
console.log('Eating...');
}
sleep(): void {
console.log('Sleeping...');
}
breathe(): void {
console.log('Breathing...');
}
}
class Dog extends Animal {
// Реализация абстрактных методов обязательна
}