抽象クラスとインターフェース

オブジェクト指向プログラミング(OOP)における**抽象クラス(abstract class)インターフェース(interface)**は、設計レベルでの多態性(ポリモーフィズム)や共通仕様の定義を可能にする高度な概念です。これらは、実装の詳細を隠蔽しつつ、複数のクラス間での共通機能を定義するために使用されます。


1. 抽象クラス(Abstract Class)

定義

抽象クラスとは、インスタンス化できないクラスであり、派生クラスでのオーバーライドを前提としたメソッド(抽象メソッド)を含むクラスです。

java
abstract class Animal { abstract void makeSound(); // 抽象メソッド(実装なし) void eat() { System.out.println("Eating..."); } }

この例では、makeSound()は派生クラスで実装が必要ですが、eat()は共通の実装を提供しています。

特徴

  • 部分的な実装を持つことができる(非抽象メソッドの定義が可能)

  • フィールド(変数)を定義可能

  • コンストラクタを持つことができる

  • 継承によって再利用性を確保

使用目的

  • 複数のサブクラスに共通する基本的な機能状態の定義

  • インターフェースよりも詳細なテンプレートを与えたいとき


2. インターフェース(Interface)

定義

インターフェースは、**すべてのメソッドが暗黙的に抽象的(Java 8以降はデフォルトメソッドあり)**であり、状態(フィールド)を持たず、実装も原則持たない仕様書のようなものです。

java
interface Movable { void move(); }

この例では、move()を実装することが要求されます。

特徴

  • 多重継承が可能

  • 実装を強制するための契約的役割

  • 通常、状態を持たない

  • Java 8以降では、defaultメソッドやstaticメソッドを定義可能

使用目的

  • 複数のクラスに対し、共通の機能(仕様)の実装を強制

  • 異なる継承階層にあるクラスでも、共通の型として扱いたいとき


3. 抽象クラスとインターフェースの比較

項目 抽象クラス インターフェース
インスタンス化 不可 不可
継承数 単一継承 多重実装可能
メソッド 抽象+具体メソッド可 原則抽象(Java 8以降はdefaultも可)
フィールド 持てる(状態を保持) 定数のみ(public static final)
コンストラクタ あり なし
主な用途 共通実装の再利用 契約(仕様)の定義

4. 実用上の選択指針

  • 共通の動作(実装)を含むクラス階層を構築したい → 抽象クラス

  • 仕様だけを共有し、異なるクラス間で共通の振る舞いを保証したい → インターフェース

  • 複数の機能(機能単位)を横断的に実装したい → インターフェース(例:Serializable, Comparable


5. 併用パターン

多くの実用システムでは、抽象クラスとインターフェースの併用が行われます。たとえば、インターフェースで「できること(契約)」を定義し、抽象クラスで「共通の実装」を提供し、具象クラスがそれらを統合して動作を実装します。


まとめ

  • 抽象クラスとインターフェースは異なる設計目的を持つ

  • 抽象クラス:共通実装の再利用

  • インターフェース:仕様・契約の共有

  • 適切に使い分け、柔軟かつ拡張性のあるクラス設計を実現することが、オブジェクト指向設計の要です

生成日:2025/06/01