この動画はメンバー限定動画です
全ての講座が
月額990円で学び放題
「子クラス」というしくみを利用すれば、あるクラスをベースに、プロパティやメソッドを追加できると紹介しました。
しかし、「商品」というクラスに対して「食品」や「文房具」、「書籍」など、それぞれの種類の子クラスが作られると、「商品」というクラス自体はどのインスタンスも利用しないというケースもあるかも知れません。
このような場合、「商品」というクラスは「抽象クラス」という特別なクラスにすることができます。抽象クラスとは、子クラスを作るためだけに存在し、それ自体のインスタンスは作れないという抽象的なクラスです。早速やってみましょう。
抽象クラスを定義しよう
抽象クラスを定義する場合、「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%
}
}
プロパティなどは通常のクラスと同様、親クラスから継承します。しかし、「抽象メソッド」については注意が必要で、これは必ず宣言をしなければなりません。宣言を省略しようとすると、エラーになります。
![](https://tomosta.jp/wp-content/uploads/2024/05/image-121-1024x443.png)
つまり、抽象クラスの抽象メソッドによって「実際のメソッドの定義を強制する」ということができるようになり、各クラスを信頼して利用できるようになるのです。このクラスを利用して、税込金額を求めましょう。
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」メソッドが準備されていることが明確になります。