Абстрактные классы

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

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

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

  • Объявляются через abstract class
  • Могут содержать обычные методы с реализацией
  • Абстрактные методы помечаются abstract и не имеют тела
  • Дочерний класс обязан реализовать все абстрактные методы

Это мощный инструмент для проектирования иерархий классов, когда нужна общая логика плюс обязательные точки расширения.

В заданиях ниже вы попрактикуетесь в создании и использовании абстрактных классов на реальных примерах.

Список тем

1. Объяви абстрактный класс

id: 40706_abstract_01_syntax

В этом задании вам нужно объявить абстрактный класс Shape с абстрактным методом getArea(). Заполните пропуски в приведённом фрагменте кода на TypeScript, вставив ключевые слова abstract в нужные места. Обратите внимание, что абстрактный класс не может быть инстанциирован напрямую, а абстрактный метод не имеет реализации и должен быть реализован в классах-наследниках.

Заполните пропуски
// Объяви абстрактный класс Shape
input1S class Shape {
    // Объяви абстрактный метод getArea, который возвращает число
    input2S getArea(): number;

    // Обычный метод для вывода информации
    printInfo(): void {
        console.log('Это фигура');
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Собери абстрактный класс и наследника

id: 40706_abstract_02_build

Из предложенных строк соберите корректную 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 сек.
Показать подсказку

3. Нельзя создать экземпляр

id: 40706_abstract_03_error

В приведённом фрагменте кода TypeScript допущена ошибка, из-за которой программа не сможет выполниться. Найдите строку, в которой происходит попытка создать экземпляр абстрактного класса, и исправьте её, чтобы код работал корректно.

Найдите ошибку и исправьте
abstract class Animal {
  abstract makeSound(): void;
}
 
class Dog extends Animal {
  makeSound() {
    console.log("Woof!");
  }
}
 
const myPet = new Animal();
myPet.makeSound();
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Что выведет код?

id: 40706_abstract_04_predict

Проанализируйте приведённый код на 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 обычное

id: 40706_abstract_05_compare

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
abstract class
abstract method
extends
implements
concrete method in abstract class
Метод с реализацией в абстрактном классе, который может быть использован подклассами.
Ключевое слово для наследования от другого класса (родительского).
Метод, объявленный без реализации, который должен быть реализован в подклассе.
Класс, который не может быть инстанциирован напрямую и может содержать абстрактные методы.
Ключевое слово для реализации интерфейса классом.
Сообщения
Проверить
Показать подсказку

6. Найди абстрактные методы

id: 40706_abstract_07_click

Внимательно изучите приведённый код абстрактного класса на 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. Выбери модификаторы

id: 40706_abstract_08_select

В данном фрагменте кода 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}`;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Порядок объявлений

id: 40706_abstract_09_sequencing

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

Расставьте строки в правильном порядке
}
const myDog = new Dog();
}
abstract class Animal {
  makeSound() { console.log("Woof!"); }
class Dog extends Animal {
  abstract makeSound(): void;
Сообщения
Проверить
Показать подсказку

9. Сколько методов нужно реализовать

id: 40706_abstract_10_give

Рассмотрите приведённый фрагмент кода на 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 {
    // Реализация абстрактных методов обязательна
}
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40706_compiler

Погрузитесь в мир абстрактных классов, которые служат строгим фундаментом для других! В этом примере мы создаем систему сотрудников: абстрактный класс задает общие правила, но не позволяет создавать объекты напрямую. Попробуйте раскомментировать создание экземпляра BaseEmployee, чтобы увидеть ошибку компиляции. Добавьте свой класс, например 'Intern', и реализуйте для него расчет зарплаты, или попробуйте изменить логику существующих методов, чтобы увидеть, как работает полиморфизм на практике!

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру