FE EXAM

インタフェース(実装すべき操作の約束)

クラスが実装すべき操作だけを定めた仕様。

DIAGRAM
インタフェース(仕様)
定められた操作
実装するクラス
«interface» Printable備えるべき操作の名前だけを定めるprint() ← 中身は書かない実装を持たない「約束(契約)」だけimplementsimplementsDocument(文書)約束した操作を実装するprint() { 文字を印刷 }Printable 型として扱える「印刷できるもの」の仲間になるPhoto(写真)約束した操作を実装するprint() { 画像を印刷 }Printable 型として扱える中身は違っても同じ操作で呼べる「print() を備えること」という約束さえ守れば、中身が違っても同じ Printable として扱える点線の白抜き三角は「インタフェースの実装(implements)」を表す
解説

📌
インタフェースとは

操作の名前だけを約束する仕様書インタフェースprint()中身(実装)は持たない

インタフェースとは、クラスが実装すべき操作だけを定めた仕様のことです。処理の中身(実装)は書かず、「このクラスはこの操作を備えること」という約束(契約)だけを決めます。

インタフェースを実装する(=そのインタフェースが約束する操作を中身ごと書く)と決めたクラスは、定められた操作を必ず用意しなければなりません。中身の作り方はクラスごとに自由です。

身近な例で考えると、電源コンセントの形(規格)に似ています。「この形のプラグなら差し込める」という約束さえ守れば、扇風機でも掃除機でも同じコンセントで使えます。中身(扇風機か掃除機か)は違っても、差込口という操作の約束が同じなら使える、という考え方です。上の図解で確認してください。

📌
抽象クラスとの違い

インタフェースとよく比べられるのが抽象クラス(=共通部分を持つが単独では実体化できない親クラス)です。どちらも単独でインスタンス化できませんが、次の点が違います。

項目インタフェース抽象クラス
実装済みメソッド原則として持たない持てる
属性(データ)原則として持たない持てる
主な役割備えるべき操作の約束を決める共通の中身を子に引き継ぐ
同時に持てる数複数を同時に実装できる通常は1つだけ継承

ざっくり言うと、インタフェースは「操作の約束だけを書いた仕様書」で、抽象クラスは「共通の中身を一部持った未完成の親」です。共通の処理も子に引き継がせたいなら抽象クラス、ただ「この操作を備えていること」だけを約束させたいならインタフェースを選びます。

もっとも大きな違いは「同時に持てる数」です。クラスの継承(抽象クラスを含む)は通常1つだけですが、インタフェースは1つのクラスがいくつでも同時に実装できます。これが次に説明する多重実装の利点につながります。

📌
多重実装の利点

1つのクラスが複数の役割を持てるPrintableSavableDocument印刷もできる・保存もできる

多重実装とは、1つのクラスが複数のインタフェースを同時に実装することです。たとえば Document クラスが「印刷できる(Printable)」と「保存できる(Savable)」の両方を実装すれば、1つのクラスに複数の役割を持たせられます。

多重実装には、主に次の利点があります。
複数の役割を持てる:継承は1つしかできませんが、インタフェースなら必要な役割をいくつでも追加できます
立場ごとに扱える:印刷機能側からは Printable、保存機能側からは Savable として、同じオブジェクトを別々の型で扱えます
柔軟に組み合わせられる:「印刷だけできるもの」「両方できるもの」など、必要な能力だけを自由に組み合わせて設計できます

身近な例で考えると、複合機(コピー機)のようなものです。「印刷できる」「スキャンできる」「FAXできる」という複数の役割(インタフェース)を1台が備えています。利用者は使いたい機能ごとに、その役割の窓口を通して操作できます。これが多重実装の便利さです。

練習問題

🎯
基本情報技術者 練習問題

Q1.オブジェクト指向における「インタフェース」の説明として最も適切なものはどれか。
A.クラスが実装すべき操作だけを定めた仕様(契約)
B.実装済みのメソッドと属性を多数持つ完成したクラス
C.親クラスの性質を子クラスが受け継ぐ仕組み
D.データを外部から隠す仕組み
Q2.インタフェースと抽象クラスの違いとして適切なものはどれか。
A.インタフェースは1つしか実装できないが、抽象クラスは複数継承できる
B.インタフェースは原則として実装を持たず操作の仕様だけを定め、1つのクラスが複数を同時に実装できる
C.インタフェースはインスタンス化できるが、抽象クラスはできない
D.インタフェースは属性(データ)を必ず持つ
Q3.多重実装(1つのクラスが複数のインタフェースを実装すること)の利点として適切なものはどれか。
A.クラスに複数の役割を持たせ、異なる立場から同じ操作で扱えるようになる
B.クラスの実行速度が必ず向上する
C.クラスの属性を自動的に暗号化できる
D.クラスをインスタンス化できなくなる

関連コンテンツ