Абстрактные ООП классы в TypeScript

Бывают ситуации, когда у нас есть родительский класс, содержащий общие свойства и методы, а от него наследуют классы-потомки.

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

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

Давайте посмотрим на примере. Возьмем наш класс User и объявим его абстрактным:

typescriptabstract class User {
  public name: string;
  
  constructor(name: string) {
    this.name = name;
  }
}

Сделаем класс Student, наследующий от User:

typescriptclass Student extends User {
  public course: number;

  constructor(name: string, course: number) {
    super(name);
    this.course = course;
  }
}

Сделаем класс Employee, наследующий от User:

typescriptclass Employee extends User {
  public salary: number;

  constructor(name: string, salary: number) {
    super(name);
    this.salary = salary;
  }
}
Задание 1

Создайте абстрактный класс Figure, представляющий собой геометрическую фигуру. Пусть в нем будут свойства для периметра и площади.

Задание 2

Сделайте класс Square, наследующий от класса Figure.

Задание 3

Сделайте класс Rectangle, наследующий от класса Figure.