TypeScript抽象クラス

概要:このチュートリアルでは、TypeScriptの抽象クラスと、それらを使用して派生クラスの共通の動作を定義する方法について学習します。

TypeScript抽象クラス入門

抽象クラスは、通常、派生クラスが拡張するための共通の動作を定義するために使用されます。通常のクラスとは異なり、抽象クラスは直接インスタンス化できません。

抽象クラスを宣言するには、abstractキーワードを使用します。

abstract class Employee {
    //...
}
Code language: TypeScript (typescript)

通常、抽象クラスには1つ以上の抽象メソッドが含まれています。

抽象メソッドには実装が含まれていません。メソッド本体を含めずに、メソッドのシグネチャのみを定義します。抽象メソッドは派生クラスで実装する必要があります。

以下は、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)

いくつかの関連クラス間でコードを共有したい場合は、抽象クラスを使用することをお勧めします。

まとめ

  • 抽象クラスはインスタンス化できません。
  • 抽象クラスには、少なくとも1つの抽象メソッドがあります。
  • 抽象クラスを使用するには、それを継承し、抽象メソッドの実装を提供する必要があります。
このチュートリアルは役に立ちましたか?