В этом руководстве вы узнаете об абстрактных классах 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 не могут быть созданы.
- Абстрактный класс имеет по крайней мере один абстрактный метод.
- Чтобы использовать абстрактный класс, вам необходимо наследовать его и предоставить реализацию для абстрактных методов.
