オブジェクト指向プログラミング(OOP)における**抽象クラス(abstract class)とインターフェース(interface)**は、設計レベルでの多態性(ポリモーフィズム)や共通仕様の定義を可能にする高度な概念です。これらは、実装の詳細を隠蔽しつつ、複数のクラス間での共通機能を定義するために使用されます。
1. 抽象クラス(Abstract Class)
定義
抽象クラスとは、インスタンス化できないクラスであり、派生クラスでのオーバーライドを前提としたメソッド(抽象メソッド)を含むクラスです。
この例では、makeSound()は派生クラスで実装が必要ですが、eat()は共通の実装を提供しています。
特徴
-
部分的な実装を持つことができる(非抽象メソッドの定義が可能)
-
フィールド(変数)を定義可能
-
コンストラクタを持つことができる
-
継承によって再利用性を確保
使用目的
-
複数のサブクラスに共通する基本的な機能や状態の定義
-
インターフェースよりも詳細なテンプレートを与えたいとき
2. インターフェース(Interface)
定義
インターフェースは、**すべてのメソッドが暗黙的に抽象的(Java 8以降はデフォルトメソッドあり)**であり、状態(フィールド)を持たず、実装も原則持たない仕様書のようなものです。
この例では、move()を実装することが要求されます。
特徴
-
多重継承が可能
-
実装を強制するための契約的役割
-
通常、状態を持たない
-
Java 8以降では、
defaultメソッドやstaticメソッドを定義可能
使用目的
-
複数のクラスに対し、共通の機能(仕様)の実装を強制
-
異なる継承階層にあるクラスでも、共通の型として扱いたいとき
3. 抽象クラスとインターフェースの比較
| 項目 | 抽象クラス | インターフェース |
|---|---|---|
| インスタンス化 | 不可 | 不可 |
| 継承数 | 単一継承 | 多重実装可能 |
| メソッド | 抽象+具体メソッド可 | 原則抽象(Java 8以降はdefaultも可) |
| フィールド | 持てる(状態を保持) | 定数のみ(public static final) |
| コンストラクタ | あり | なし |
| 主な用途 | 共通実装の再利用 | 契約(仕様)の定義 |
4. 実用上の選択指針
-
共通の動作(実装)を含むクラス階層を構築したい → 抽象クラス
-
仕様だけを共有し、異なるクラス間で共通の振る舞いを保証したい → インターフェース
-
複数の機能(機能単位)を横断的に実装したい → インターフェース(例:
Serializable,Comparable)
5. 併用パターン
多くの実用システムでは、抽象クラスとインターフェースの併用が行われます。たとえば、インターフェースで「できること(契約)」を定義し、抽象クラスで「共通の実装」を提供し、具象クラスがそれらを統合して動作を実装します。
まとめ
-
抽象クラスとインターフェースは異なる設計目的を持つ
-
抽象クラス:共通実装の再利用
-
インターフェース:仕様・契約の共有
-
適切に使い分け、柔軟かつ拡張性のあるクラス設計を実現することが、オブジェクト指向設計の要です
生成日:2025/06/01