この動画はメンバー限定動画です

全ての講座が
月額990円で学び放題

講座の情報を見る

TypeScript入門抽象クラスを作ろう

記事を共有:

  • X
  • Pocket
  • クリップボードにコピー

「子クラス」というしくみを利用すれば、あるクラスをベースに、プロパティやメソッドを追加できると紹介しました。

しかし、「商品」というクラスに対して「食品」や「文房具」、「書籍」など、それぞれの種類の子クラスが作られると、「商品」というクラス自体はどのインスタンスも利用しないというケースもあるかも知れません。

このような場合、「商品」というクラスは「抽象クラス」という特別なクラスにすることができます。抽象クラスとは、子クラスを作るためだけに存在し、それ自体のインスタンスは作れないという抽象的なクラスです。早速やってみましょう。

抽象クラスを定義しよう

抽象クラスを定義する場合、「abstract」(抽象的なという意味)という宣言でクラスを定義します。

abstract class Item {
  name: string = "";
  price: number = 0;
  abstract getTaxPrice(): number;
}

これで、Itemクラスは抽象クラスとなり、次のように直接インスタンスを作れなくなります。

const item: Item = new Item();

また、抽象クラスには「抽象メソッド」を定義することができます。次の記述を見てみましょう。

abstract getTaxPrice(): number;

メソッド名の前に「abstract」という宣言が追加されていて、またこのメソッドには内容が存在しません。これが何の意味があるかについて、この後紹介しましょう。

Itemクラスを継承しよう

抽象クラスの継承は、通常のクラスと同様で「extends」を利用します。まずは、食品を扱うFoodクラスを定義しましょう。

class Food extends Item {
  getTaxPrice(): number {
    return this.price * 1.08; // 8%
  }
}

プロパティなどは通常のクラスと同様、親クラスから継承します。しかし、「抽象メソッド」については注意が必要で、これは必ず宣言をしなければなりません。宣言を省略しようとすると、エラーになります。

つまり、抽象クラスの抽象メソッドによって「実際のメソッドの定義を強制する」ということができるようになり、各クラスを信頼して利用できるようになるのです。このクラスを利用して、税込金額を求めましょう。

const peach = new Food();
peach.price = 150;
console.log(peach.getTaxPrice()); // 162

続けて、文房具を扱う「stationery」クラスを定義してみましょう。

class Stationery extends Item {
  getTaxPrice(): number {
    return this.price * 1.1; // 10%
  }
}

こちらも利用してみます。

const pencil = new Stationery();
pencil.price = 80;
console.log(pencil.getTaxPrice());

こうして、Itemクラスを継承した各クラスには「getTaxPrice」メソッドが準備されていることが明確になります。

前のレッスン 次のレッスン