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

В этом руководстве вы узнаете об абстрактных классах TypeScript.

Введение в абстрактные классы TypeScript

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

Чтобы объявить абстрактный класс, используйте ключевое слово abstract :

abstract class Employee {
    //...
}

Как правило, абстрактный класс содержит один или несколько абстрактных методов.

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

Ниже показан абстрактный класс Employee getSalary() с абстрактным методом:

abstract class Employee {
    constructor(private firstName: string, private lastName: string) {
    }
    abstract getSalary(): number
    get fullName(): string {
        return `${this.firstName} ${this.lastName}`;
    }
    compensationStatement(): string {
        return `${this.fullName} makes ${this.getSalary()} a month.`;
    }
}

В классе Employee :

  • Конструктор объявляет firstName и lastName.
  • Метод getSalary() является абстрактным методом. Производный класс будет реализовывать логику на основе типа сотрудника.
  • getFullName() и compensationStatement() содержат подробную реализацию. Обратите внимание, что метод compensationStatement() вызывает метод getSalary().

Поскольку класс Employee является абстрактным, вы не можете создать из него новый объект. Следующее утверждение вызывает ошибку:

let employee = new Employee('John','Doe');

Ошибка:

error TS2511: Cannot create an instance of an abstract class.

Следующий класс FullTimeEmployee наследуется от класса Employee :

class FullTimeEmployee extends Employee {
    constructor(firstName: string, lastName: string, private salary: number) {
        super(firstName, lastName);
    }
    getSalary(): number {
        return this.salary;
    }
}

В этом классе FullTimeEmployee зарплата задается в конструкторе. Поскольку getSalary() является абстрактным методом класса Employee, класс FullTimeEmployee должен реализовать этот метод. В этом примере он просто возвращает зарплату без каких-либо вычислений.

Ниже показан класс Contractor, который также наследуется от класса Employee :

class Contractor extends Employee {
    constructor(firstName: string, lastName: string, private rate: number, private hours: number) {
        super(firstName, lastName);
    }
    getSalary(): number {
        return this.rate * this.hours;
    }
}

В классе Contractor конструктор инициализирует скорость и часы. Метод getSalary() вычисляет заработную плату путем умножения ставки на количество часов.

Следующее сначала создает объект FullTimeEmployee и объект Contractor, а затем выводит на консоль отчеты о компенсации:

let john = new FullTimeEmployee('John', 'Doe', 12000);
let jane = new Contractor('Jane', 'Doe', 100, 160);

console.log(john.compensationStatement());
console.log(jane.compensationStatement());

Выход:

John Doe makes 12000 a month.
Jane Doe makes 16000 a month.

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

Заключение

  • Абстрактные классы в TypeScript не могут быть созданы.
  • Абстрактный класс имеет по крайней мере один абстрактный метод.
  • Чтобы использовать абстрактный класс, вам необходимо наследовать его и предоставить реализацию для абстрактных методов.
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript