abstract class 抽象クラス
最終更新:2026-10-22
abstract class 抽象クラス
抽象クラス(abstract class)は「未完成の基底クラス」です。実装を含めることも、抽象メンバー(abstract area(): number)として宣言だけしてサブクラスに必ず埋めさせることもできます。直接インスタンス化はできず、extends されるだけです。「すべてのサブクラスが骨格を共有し、細部はそれぞれ実装する」ことを表すのに適しています。
| グループ | 関数とクラス |
|---|---|
| 種類 | 構文 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
abstract class Shape {
constructor(protected name: string) {}
abstract area(): number; // 抽象メソッド:シグネチャのみ
describe(): string { // 具体メソッド:サブクラスがそのまま継承
return `${this.name}: ${this.area().toFixed(2)}`;
}
}
class Circle extends Shape {
constructor(private radius: number) { super("circle"); }
area(): number { return Math.PI * this.radius ** 2; }
}
⚙️ パラメータ
| abstract class | 抽象クラス:new できず、継承されるだけです |
|---|---|
| abstract area(): number | 抽象メンバー:シグネチャのみで実装を持たず、サブクラスが実装しないとコンパイルエラーになります |
| protected | 抽象クラスとよく組み合わせます。name のような「サブクラスに使わせる」状態です |
戻り値:抽象メソッドはシグネチャだけ書きます。具体メソッドは通常どおり戻り値型を注釈します。抽象クラスのインスタンスは存在せず、実行中のオブジェクトはすべてサブクラスのインスタンスです。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
circle: 3.14
square: 4.00
(トランスパイル後の実行出力。new Shape("x") はコンパイルエラー TS2511 になります——トランスパイル後の JS では実際には普通のクラスなのに、です)
💡 ポイント
ℹ️ 説明 抽象性もコンパイル時のものです。tsc は new Shape() を禁じますが、トランスパイル後の JS は普通のクラスで、実行時に new しても失敗しません——これは「うっかり防止」であって「物理的な封鎖」ではありません。
💡 ヒント 抽象クラス vs インターフェース:抽象クラスは状態と実装を運べます(テンプレートメソッドパターンの核心)。インターフェースは形状しか記述しません。コードを共有するなら抽象クラス、形状だけを縛るならインターフェース。両方を同時に使うこともできます。
⚠️ 注意 抽象クラスは単一継承のみです(extends できるのは1つのクラス)。「複数の能力」が要るときはインターフェース + コンポジションで対応し、継承チェーンを無理に組み上げないでください。
🏷️ 関連関数とクラス
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q 抽象クラスを new するとどうなりますか?
A コンパイルエラー TS2511(抽象クラスのインスタンスは作成できません)。トランスパイル後の JS では普通のクラスで、実行時に new してもエラーになりません——だから実行時の保護を当てにしてはいけません。
Q 抽象クラスにコンストラクタを持たせられますか?
A 持たせられますし、多くは protected と組み合わせます。protected 修飾されたコンストラクタも外部からの new を禁じます(サブクラスは super 呼び出しが可能)。「直接インスタンス化の禁止」の別の表現です。
Q 抽象クラスとインターフェース、どちらを選ぶべきですか?
A 実装や状態を共有したい(describe メソッドや name フィールド)→ 抽象クラス。契約だけを定義し、1つのクラスに複数実装させたい → インターフェース。よくある組み合わせは、インターフェースで外部契約を定義し、抽象クラスでデフォルト実装を提供する形です。