継承とオーバーライド
クラスの継承(extends
)を使って、親クラス(基底クラス)の機能を再利用しながら、サブクラスで独自の振る舞い(オーバーライド)を定義できます。
✅ 継承(Inheritance)とは?
親クラス(基底クラス)のプロパティやメソッドを子クラスに引き継ぐ機能です。
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
bark() {
console.log(`${this.name} says: ワン!`);
}
}
const dog = new Dog("ポチ");
dog.speak(); // ポチ makes a sound.
dog.bark(); // ポチ says: ワン!
Dog
クラスはAnimal
をextends
しているため、speak()
を継承して使用可能Dog
クラスは独自のbark()
も使用できる
🔁 オーバーライド(Override)とは?
親クラスで定義されたメソッドを、子クラスで上書きして独自の処理に変更することです。
class Cat extends Animal {
// オーバーライド
speak() {
console.log(`${this.name} says: ニャー!`);
}
}
const cat = new Cat("ミケ");
cat.speak(); // ミケ says: ニャー!
- 同じ
speak()
というメソッド名でも、親とは異なる処理に置き換えられる
📝 オーバーライド時の型安全性(オプション)
TypeScript 4.3 以降では override
修飾子が利用可能です:
class Bird extends Animal {
override speak() {
console.log(`${this.name} chirps.`);
}
}
override
を付けると、親に同名メソッドがない場合はエラーになるため、継承構造の安全性が高まります。
⚠️ 注意:コンストラクタの継承と super
親クラスにコンストラクタがある場合、子クラスのコンストラクタで super()
を呼び出す必要があります。
class Animal {
constructor(public name: string) {}
}
class Lion extends Animal {
constructor(name: string, public color: string) {
super(name); // ✅ 親のconstructorを呼び出す
}
}
✅ まとめ:継承とオーバーライドのポイント
機能 | 説明 |
---|---|
extends |
親クラスからプロパティ・メソッドを引き継ぐ |
メソッド定義 | 同名メソッドを定義するとオーバーライドになる |
override |
明示的なオーバーライドチェックを強制できる(TS 4.3+) |
super() |
コンストラクタ内で親クラスの初期化処理を呼び出す必要がある |
📚 継承が向いているケース
- 共通のプロパティや振る舞いを複数のクラスで共有したいとき
- 部品を差し替えたいが、ベースのロジックは共通にしたいとき(テンプレートメソッドパターンなど)
- ポリモーフィズムを使いたいとき(
Animal[]
にDog
,Cat
を混在させるなど)
継承とオーバーライドを活用することで、コードの再利用性が高まり、ロジックを役割ごとに分離した柔軟な設計が可能になります。