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