サブクラスとは?定義・例・オブジェクト指向での使い方
サブクラスの定義から具体例、オブジェクト指向での使い方と設計のコツを初心者向けに分かりやすく解説する入門ガイド。
サブクラスという意味もある。
サブクラスの定義
サブクラスとは、オブジェクト指向プログラミングにおいて、あるクラス(スーパークラスまたは親クラス)を継承して機能を受け継ぎ、拡張または変更したクラスを指します。サブクラスはスーパークラスのプロパティ(フィールド)やメソッドを利用でき、必要に応じて新しい振る舞いを追加したり、既存の振る舞いを上書き(オーバーライド)したりします。
基本的な特徴
- 継承(Inheritance):コードの再利用と階層構造の表現。
- メソッドのオーバーライド:サブクラスでスーパークラスのメソッドを再定義できる。
- ポリモーフィズム(多態性):スーパークラス型の変数がサブクラスのインスタンスを参照でき、動的に適切なメソッドが呼ばれる。
- アクセス制御:protected や public などのアクセス修飾子により、サブクラスからアクセスできるメンバーが決まる。
簡単な例(Java)
Java の場合:
class Animal { public void speak() { System.out.println("..."); } } class Dog extends Animal { @Override public void speak() { System.out.println("ワン"); } } Animal a = new Dog(); a.speak(); // 実行時に Dog の speak が呼ばれる(ポリモーフィズム) 簡単な例(Python)
class Animal: def speak(self): print("...") class Dog(Animal): def speak(self): print("ワン") a = Dog() a.speak() # Dog の speak が呼ばれる 抽象クラスとインターフェース
- 抽象クラス:共通の振る舞いを定義しつつ、具象メソッドと抽象メソッドを混在させられる。サブクラスは抽象メソッドを実装する必要がある。
- インターフェース:実装すべきメソッドの契約を定義する。言語によっては多重継承の代替手段として使われる。
言語ごとの違い(簡単)
- Java:単一継承(クラスは一つのスーパークラスのみ継承)。複数インターフェースの実装が可能。
- C++:多重継承が可能だが、ダイアモンド問題など注意点がある。
- Python:多重継承が可能で、メソッド解決順序(MRO)が重要。
設計上の注意点
- Liskov Substitution Principle(LSP):サブクラスはスーパークラスの代替として振る舞えるべき。契約(前提・結果)を壊さないこと。
- 継承より合成を優先:必要以上に継承すると柔軟性が下がるため、「has-a(合成)」で解決できないか検討する。
- アクセス修飾子:protected や private を適切に使い、サブクラスと外部からのアクセスを制御する。
- ネーミングと責務:サブクラスはスーパークラスの責務を拡張する形で使い、責務が曖昧にならないようにする。
よくある使い方
- UI コンポーネントの共通化(共通振る舞いを基底クラスに置く)
- テスト用のモックやスタブの作成(テスト用サブクラス)
- ドメインモデルでの特殊化(例:Employee → Manager)
まとめ
サブクラスはオブジェクト指向の重要な機能で、コードの再利用・拡張・多態性を実現します。ただし、設計原則(LSP、合成優先など)を無視した乱用は保守性の低下を招くため、使いどころと責務の整理が重要です。
百科事典を検索する