摘要:在本教程中,您将学习 TypeScript 抽象类以及如何使用它们为派生类定义通用行为。
TypeScript 抽象类的介绍
抽象类通常用于定义派生类扩展的通用行为。与普通的类不同,抽象类不能直接实例化。
要声明一个抽象类,您使用abstract关键字
abstract class Employee {
//...
}
Code language: TypeScript (typescript)通常,抽象类包含一个或多个抽象方法。
抽象方法不包含实现。它仅定义方法的签名,而不包括方法体。抽象方法必须在派生类中实现。
以下显示了具有getSalary()抽象方法的Employee抽象类
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.`;
}
}Code language: TypeScript (typescript)在Employee类中
- 构造函数声明了
firstName和lastName属性。 getSalary()方法是一个抽象方法。派生类将根据员工类型实现逻辑。getFullName()和compensationStatement()方法包含详细的实现。请注意,compensationStatement()方法调用了getSalary()方法。
因为Employee类是抽象的,所以您不能从中创建一个新对象。以下语句会导致错误
let employee = new Employee('John','Doe');Code language: TypeScript (typescript)错误
error TS2511: Cannot create an instance of an abstract class.Code language: TypeScript (typescript)以下FullTimeEmployee类继承自Employee类
class FullTimeEmployee extends Employee {
constructor(firstName: string, lastName: string, private salary: number) {
super(firstName, lastName);
}
getSalary(): number {
return this.salary;
}
}Code language: TypeScript (typescript)在这个FullTimeEmployee类中,工资在构造函数中设置。因为getSalary()是Employee类的抽象方法,所以FullTimeEmployee类需要实现此方法。在本例中,它只是返回工资,没有任何计算。
以下显示了也继承自Employee类的Contractor类
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;
}
}Code language: TypeScript (typescript)在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());Code language: TypeScript (typescript)输出
John Doe makes 12000 a month.
Jane Doe makes 16000 a month.Code language: TypeScript (typescript)当您希望在一些相关类之间共享代码时,使用抽象类是一个好习惯。
总结
- 抽象类不能被实例化。
- 抽象类至少有一个抽象方法。
- 要使用抽象类,您需要继承它并为抽象方法提供实现。
本教程是否有帮助?