クラスが実装すべき操作だけを定めた仕様。
インタフェースとは、クラスが実装すべき操作だけを定めた仕様のことです。処理の中身(実装)は書かず、「このクラスはこの操作を備えること」という約束(契約)だけを決めます。
インタフェースを実装する(=そのインタフェースが約束する操作を中身ごと書く)と決めたクラスは、定められた操作を必ず用意しなければなりません。中身の作り方はクラスごとに自由です。
身近な例で考えると、電源コンセントの形(規格)に似ています。「この形のプラグなら差し込める」という約束さえ守れば、扇風機でも掃除機でも同じコンセントで使えます。中身(扇風機か掃除機か)は違っても、差込口という操作の約束が同じなら使える、という考え方です。上の図解で確認してください。
インタフェースとよく比べられるのが抽象クラス(=共通部分を持つが単独では実体化できない親クラス)です。どちらも単独でインスタンス化できませんが、次の点が違います。
| 項目 | インタフェース | 抽象クラス |
|---|---|---|
| 実装済みメソッド | 原則として持たない | 持てる |
| 属性(データ) | 原則として持たない | 持てる |
| 主な役割 | 備えるべき操作の約束を決める | 共通の中身を子に引き継ぐ |
| 同時に持てる数 | 複数を同時に実装できる | 通常は1つだけ継承 |
ざっくり言うと、インタフェースは「操作の約束だけを書いた仕様書」で、抽象クラスは「共通の中身を一部持った未完成の親」です。共通の処理も子に引き継がせたいなら抽象クラス、ただ「この操作を備えていること」だけを約束させたいならインタフェースを選びます。
もっとも大きな違いは「同時に持てる数」です。クラスの継承(抽象クラスを含む)は通常1つだけですが、インタフェースは1つのクラスがいくつでも同時に実装できます。これが次に説明する多重実装の利点につながります。
多重実装とは、1つのクラスが複数のインタフェースを同時に実装することです。たとえば Document クラスが「印刷できる(Printable)」と「保存できる(Savable)」の両方を実装すれば、1つのクラスに複数の役割を持たせられます。
多重実装には、主に次の利点があります。
・複数の役割を持てる:継承は1つしかできませんが、インタフェースなら必要な役割をいくつでも追加できます
・立場ごとに扱える:印刷機能側からは Printable、保存機能側からは Savable として、同じオブジェクトを別々の型で扱えます
・柔軟に組み合わせられる:「印刷だけできるもの」「両方できるもの」など、必要な能力だけを自由に組み合わせて設計できます
身近な例で考えると、複合機(コピー機)のようなものです。「印刷できる」「スキャンできる」「FAXできる」という複数の役割(インタフェース)を1台が備えています。利用者は使いたい機能ごとに、その役割の窓口を通して操作できます。これが多重実装の便利さです。