質問内容
abstractクラス
について質問させてください m(_ _)m
abstractクラス
を継承して実装すべきメソッドをサブクラスにて担保させる場合
abstractクラス内にて
以下のように定義するかと思います。
//抽象クラス abstract class Department { constructor(public name: string) { } printName(): void { console.log("Department name: " + this.name); } abstract printMeeting(): void; // 継承するクラスで実装しなければいけない } //具象クラス class AccountingDepartment extends Department { constructor() { super("Accounting and Auditing"); // 継承したクラスのコンストラクタ内でsuper()を呼ばなけれいけない } printMeeting(): void { console.log("The Accounting Department meets each Monday at 10am."); } public generateReports(): void { console.log("Generating accounting reports..."); } } let department: Department; // OK: 抽象型を参照する変数の作成 department = new Department(); // エラー: 抽象クラスのインスタンスの作成は不可 department = new AccountingDepartment(); // OK: 抽象クラスでは無いサブクラスの作成と割り当て department.printName(); department.printMeeting(); department.generateReports(); // (A)エラー: このメソッドは定義した抽象型上には存在しない
(A)の箇所ですが、抽象クラス(Departmentクラス)にはgenerateReports
というメソッドは存在しないため、エラーとなってるかと思います。
これを解消するためにはDepartmentクラスに
abstract generateReports(): void;
とabstractアクセサ
をつけて宣言するか
もしくは
public generateReports(): void { console.log("Generating accounting reports..."); }
と実装したメソッドを定義する必要があるかと思います。
ですが、往々にして具象クラスのみで使用したいメソッド
もあるかと思います。
このような場合はどういう書き方がベターなのでしょうか?
自分が考えられる方法としましてはineterfaceを実装する
という方法が考えらました。
interface IDepartment { printMeeting(): void; } class AccountingDepartment implements IDepartment { name: string = "Accounting and Auditing" constructor() {} printName(): void { console.log("Department name: " + this.name); } // interfaceで宣言された実装すべきメソッド printMeeting(): void { console.log("The Accounting Department meets each Monday at 10am."); } // ここは各々の具象クラスにて定義できる generateReports(): void { console.log("Generating accounting reports..."); } } const department:AccountingDepartment = new AccountingDepartment(); department.printName(); department.printMeeting(); department.generateReports();
と考えるとなかなか、気軽にabstractクラス
を継承するとabstractクラス
内にabstrctアクセサのメソッド
が増え続ける可能性があり危険な気がしてきました。
ということでabstractクラス
は使いどころが難しい気がしてるのですが、如何でしょうか?
それとも、そもそもの考え方も間違ってるのでしょうか?
お手数ですがご教示いただけますと幸いです。
追記
typescriptの公式サイトのplaygroundで試してみたものを貼っておきます!
回答1件
あなたの回答
tips
プレビュー