オブジェクト指向におけるインターフェースについて

一般的なインターフェースについて

インターフェース(interface, I/F)とは

インタフェースとは、ものごとの境界となる部分のこと、または境界における規約(プロトコル)のことを指します。
言い換えれば、ものごと同士が情報などのやり取りをする際の「界面における円滑化の仕組み」を意味します。


現実世界におけるインターフェースの例

日常で利用されるインターフェースといえば、例えば「USBケーブル」や「HDMIケーブル」などが挙げられます。
USBケーブルで接続する機器は、USBインターフェイスを備えたデバイスであるため、PCのUSBポートに接続して使用することができます。
これは、USB規格という共通化された仕様・形状に基づいて設計されたUSBデバイスが、デバイスの情報取得コマンドや操作コマンドに応答できるように作成されているために実現されています。
一方で、PCからはデバイスを意識することなく、デバイスに対する各種コマンドを発行して、目的の機能を実現することができます。
つまり、インターフェースが定義されていることで、PCと多種多様なデバイスを接続することが可能となります。


インターフェースの種類

ITシステムに関連するインターフェースは、以下の3種類に分類されます。

種類 説明
ハードウェアインターフェイス 機器と機器をつなぐものであり、コネクター(接続機)の形状によって種類が異なります。
例えば、USB、HDMI、DVI、PCI-Express、Ethernet、Bluetooth、電源コンセントなどがあります。
ソフトウェアインターフェイス プログラムとプログラムの間でデータをやり取りする際の手順や方法を定めたものです。
API(Application Programming Interface)やプロセス間通信、ネットワーク通信などがあります。
ユーザーインターフェイス 機器と使用者とを結びつける役割を果たすものです。
GUI(Graphical User Interface)、CLI(Command Line Interface)、マンマシンインタフェースなどがあります。


オブジェクト指向におけるインターフェースとは

オブジェクト指向のインターフェースについて

オブジェクト指向におけるインターフェースとは、「クラスが備えているべき仕様や性質を定義するもの」です。
インターフェースはクラスに対して「何をするのか」を定義し、どのように実装するかはそれぞれのクラスに任せます。
つまり、どういう方法で処理を実行するかはそのインターフェースを実装するクラス(implements class)で決めます。


インターフェースの利用例

インターフェースはオブジェクトの役割を表したものであり、複数種類のオブジェクトに共通する機能を実装するためのメッセージ規格を定義するために利用します。
あるインタフェースを実装したクラスは、同一のインタフェースを実装したクラス間でインタフェースで定義された機能の実装を共通して持っていることになります。


// ミュージシャンというクラス
class Musician {
    void play(MusicalInstrument instrument) {
        instrument.play();
    }
}

// 楽器というインターフェース
interface MusicalInstrument {
    // 抽象メソッド
    void play(); // 演奏する
}

// バイオリンというimplementsクラス
class Violin implements MusicalInstrument {
    void play() {
        // Violin固有のメソッドの実装
    }
}

// ギターというimplementsクラス
class Guitar implements MusicalInstrument {
    void play() {
        // Guitar固有のメソッドの実装
    }
}

クラス定義を利用すると下記のようになります。


Musician musician = new Musician();

Violin violin = new Violin();
musician.play(violin);

Guitar guitar = new Guitar();
musician.play(guitar);

Musicianから見てMusicalInstrumentインターフェースを持つ実装クラスは、すべてplay()を実行することが可能なモノとなります。
今後、Musicianが演奏できる新たな楽器クラスを作成するには、MusicalInstrumentインターフェースを持つ実装クラスを用意すればよいことになります。


インターフェースの利点

インターフェースを利用するメリットは2つあります。

まず一つ目は、ポリモーフィズムを実現できることです。
ポリモーフィズムとは、同じインターフェースを実装した異なるクラスのオブジェクトを、同じ型のオブジェクトとして扱うことができる特性のことです。
これは、既存のコードに変更を加えずに新しいクラスを追加できるという、拡張性を高める効果があります。
上記例でいえば、新しくピアノクラスやサックスクラスを作成しても既存楽器に影響はなく、演奏者もこれまでと同じやり方で扱うことができます。

二つ目は、クラスの機能を保証することです。
インターフェイスを実装したクラスは、そのインターフェイスに定義されたメソッドを必ず実装しなければなりません。
つまり、インターフェイスを利用することで、そのクラスに特定の機能があることが保証されます。
これは、クラスを利用する側にとっては、インターフェイスが共通であるクラスの使い方は共通である、という理解を生むことができます。


インターフェースと抽象クラスの違いについて

抽象クラス(Abstract)とは

抽象クラスとは、継承される目的で実装されるクラスのことです。
抽象クラスは、直接インスタンス化(new)することができず、必ずスーパークラスとして利用することを保証する必要があります。


abstract class クラス名{
    abstract 戻り値の型 抽象メソッド(引数の型 引数);

    public 戻り値の型 メソッド(引数の型 引数) {
        // メソッドの処理
    }
}

抽象クラスでは、「抽象メソッド」と「具象メソッド」を持ちます。
抽象メソッドとは、それ自体は中身や機能を持っておらず、派生クラスの方でオーバーライドして機能を提供するメソッドです。
具象メソッドは、通常にメソッドのことであり、中身や機能を定義してあり、継承クラスから呼び出すことが可能です。


抽象クラスの利点

インターフェースを利用するメリットは2つあります。

一つ目は、抽象クラスを利用するメリットはポリモーフィズムを実現できることです。
これはインターフェースと同じことが実現できるという意味になります。
これこそが、インターフェースと抽象クラスの役割が曖昧に感じる要因となっています。

二つ目は、処理の再利用(共通化)を行えることです。
抽象クラスはメソッドを実装でき、そのメソッドを継承先のサブクラスから呼び出すことができます。
一方、インターフェースは実装を持つことができず、共通処理を定義することができません。


インターフェースと抽象クラスの違いはクラス間の関係性である

抽象クラスと具象クラスの関係は「IS A」の関係であり、子クラスが共通して出来ることを親クラスにまとめます。
これは、類似の子クラスを作成する際に親クラスの機能を流用できるので、子クラスを作成するための作業量を軽減できるというメリットがあります。

一方、インターフェイスと実装クラスは「CAN DO」の関係であり、インタフェースには出来ることのみを定義し、具体的なことは実装クラスにお任せします。
これは、実装クラスを使う側にとって、中で実装された詳細は気にする必要が無く、他と同じように利用することができるメリットがあります。


機能面の違い

その他に、以下のような機能面で異なる点もあります。

種類 利用の仕方 コンストラクタやフィールドについて 多重継承
抽象クラス extendsでクラスへ継承する 保持できる 多重継承ができる
インタフェース implementsでクラスに実装する 保持できない 多重継承ができない(インターフェース同士では可能)

関連ページ