Dev Study
← 解説「abstract — 抽象クラス」に戻る

サンプルコードで身につける: abstract — 抽象クラス

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1抽象クラスの最小形 — new できない土台

abstract を付けたクラスは new できず、継承されるためだけに存在します。abstract メソッドは名前と型だけを宣言し、実装は子クラスに義務付けます。実装を忘れると子クラスの定義時点でエラーになるのがポイントです。

TypeScript

2共通実装 + abstract — 流れは親、中身は子

共通の処理(printAll)は親が実装を持ち、クラスごとに違う部分(body)だけを abstract にしています。「処理の流れは親が決め、中身は子が埋める」というテンプレートメソッドと呼ばれる設計の最小形です。帳票やレポートの生成処理で実務でもよく見ます。

TypeScript

3abstract プロパティ — 値の用意も義務にできる

abstract にできるのはメソッドだけでなくプロパティもです。親の describe() は、まだ実体のない this.planName を使って書けています。「子クラスが必ず持つ」という約束があるからこそ成立する共通実装です。

TypeScript

4抽象クラスを型として使う

抽象クラスは変数や配列の型としても使えます。Shape[] に入れてしまえば、使う側は「area() がある」ことだけ知っていればよく、中身が Square か Circle かを気にせず一律に処理できます。「同じ操作を持つ一群のクラス」をまとめて扱う基本形です。

TypeScript

5通知チャネルの抽象化

通知チャネルの抽象化は abstract の代表的な実務例です。宛名の整形のような共通処理は親の send() が持ち、メール・チャットなど手段ごとに違う部分だけを deliver() として子に書かせます。チャネルを追加したくなったら、クラスを1つ増やすだけで済みます。

TypeScript