継承
公開日: 2025/06/02
継承とは?──オブジェクト指向を効率化するコード再利用のしくみ
はじめに
オブジェクト指向プログラミングにおいて、「継承(Inheritance)」は中心的な概念のひとつです。あるクラスの機能を別のクラスに引き継ぐことで、コードの重複を避け、拡張性の高い設計が可能になります。本記事では、継承の基本的な仕組みから、実践的な使い方、注意すべき設計上のポイントまでをわかりやすく解説します。
基本情報・概要
継承とは、あるクラス(親クラス、スーパークラス)のプロパティやメソッドを、別のクラス(子クラス、サブクラス)が引き継ぐしくみです。
親クラスの機能を再利用しつつ、子クラス固有の機能を追加することで、冗長なコードを避け、拡張可能なアーキテクチャを実現します。継承は特に、共通の属性や動作を持つ複数のオブジェクトを扱う場合に有効です。
比較・分類・特徴の表形式まとめ(任意)
用語 | 意味・役割 |
---|---|
親クラス(スーパークラス) | 共通機能を定義する元のクラス |
子クラス(サブクラス) | 親クラスを継承し、追加・上書きできるクラス |
メソッドのオーバーライド | 親クラスのメソッドを子クラスで再定義 |
単一継承/多重継承 | 一つの親クラスから継承するか、複数から継承するかの違い |
継承は「is-a(~である)」関係に適した場面で使うべきです。
深掘り解説
JavaScriptのES6クラス構文では、
extends
を使って継承を実現します。
class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name}が鳴いています`); } } class Dog extends Animal { speak() { console.log(`${this.name}はワン!と鳴いた`); } } const dog = new Dog("ポチ"); dog.speak(); // ポチはワン!と鳴いた
この例では、
Dog
クラスはAnimal
クラスを継承しており、speak()
メソッドをオーバーライドしています。
Pythonでは次のように書きます:
class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name}が鳴いています") class Dog(Animal): def speak(self): print(f"{self.name}はワン!と鳴いた")
言語によって構文は異なりますが、継承の基本思想は共通しています。
応用・発展的な使い方
- 共通基底クラスの抽出:重複コードを親クラスにまとめることで保守性を向上
- 抽象クラス/インターフェースの活用:メソッドの実装を子クラスに強制する
- 多重継承(Python):複数の親クラスから機能を引き継ぐ(ただし複雑さに注意)
- ポリモーフィズムとの組み合わせ:異なるクラスでも同じメソッド名で処理を統一
継承を使いこなすことで、設計の柔軟性と拡張性が飛躍的に向上します。
よくある誤解と注意点(任意)
- 継承の乱用:構造が複雑になり、保守が困難になる「過剰な継承地獄」に注意
- is-a関係でない場面で使う:継承ではなく「委譲(composition)」が適切な場合もある
- 親クラス変更の影響が大きい:子クラスに意図せぬ副作用を及ぼす可能性あり
- オーバーライドの忘れ:親の振る舞いがそのまま適用されてしまうこともある
継承はパワフルですが、「使えばよい」ではなく「適切に使う」ことが重要です。
まとめ
継承は、クラス間で共通のロジックを共有し、柔軟で拡張性のあるコード設計を実現するための手段です。一方で、設計の意図や構造を正しく捉えないまま継承を多用すると、コードの複雑化を招きます。まずはシンプルな継承からスタートし、適切なタイミングで抽象化やポリモーフィズムなどと組み合わせて、堅牢な設計へと発展させていきましょう。