抽象クラス (abstract class)
JavaやPHPなどの言語では、abstract修飾子を使って抽象クラスを定義できます。抽象クラスは、直接インスタンスを作れないクラスのことです。JavaScriptには抽象クラスを定義する構文はありません。一方、TypeScriptにはabstract修飾子があり抽象クラスを表現できます。
abstractは抽象クラスを作成する時に宣言します。抽象クラスとは直接インスタンス化(new)することができず、必ずスーパークラスとして利用することを保証するものです。抽象クラス内のメソッドにもabstract宣言を行うことができます。interfaceと同じようにサブクラスは抽象メソッドを実装する必要があります。
Foodクラスに抽象クラスに変更し、"要冷蔵"メソッドkeepRefrigerated()を抽象メソッドとして追加するとMeatクラスでエラーが発生します。これはMeatクラスにkeepRefrigeratedメソッドが実装されていないからです。
tsabstract classFood {constructor(protectedname : string, protectedcalorie : number) {}showDebug () {console .log (`name = ${this.name } `);console .log (`calorie = ${this.calorie }kcal `);}abstractkeepRefrigerated (): boolean;}classNon-abstract class 'Meat' does not implement inherited abstract member 'keepRefrigerated' from class 'Food'.2515Non-abstract class 'Meat' does not implement inherited abstract member 'keepRefrigerated' from class 'Food'.extends Meat Food {}
tsabstract classFood {constructor(protectedname : string, protectedcalorie : number) {}showDebug () {console .log (`name = ${this.name } `);console .log (`calorie = ${this.calorie }kcal `);}abstractkeepRefrigerated (): boolean;}classNon-abstract class 'Meat' does not implement inherited abstract member 'keepRefrigerated' from class 'Food'.2515Non-abstract class 'Meat' does not implement inherited abstract member 'keepRefrigerated' from class 'Food'.extends Meat Food {}
keepRefrigerated()メソッドを実装することによりエラーはなくなります。
tsclassMeat extendsFood {keepRefrigerated (): boolean {return true;}}
tsclassMeat extendsFood {keepRefrigerated (): boolean {return true;}}