TypeScript 抽象类

摘要:在本教程中,您将学习 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类中

  • 构造函数声明了firstNamelastName属性。
  • 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)

当您希望在一些相关类之间共享代码时,使用抽象类是一个好习惯。

总结

  • 抽象类不能被实例化。
  • 抽象类至少有一个抽象方法。
  • 要使用抽象类,您需要继承它并为抽象方法提供实现。
本教程是否有帮助?