ホームに戻る
出典 :
インタフェース (抽象型) - Wikipedia 【詳解】抽象クラスとインタフェースを使いこなそう!! - Qiita 【Java入門】インターフェースとは?抽象クラス(abstract)との違い
関連 :
[C++]継承 (Inheritance) [C++]仮想関数 (Virtual Function) 継承と委譲
目次 :

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

入出力の形式のみを定めた、実装を持たない抽象型のこと。即ち、引数と戻り値のみを定めた純粋仮想関数のみを有するクラスを指す。
共通のインタフェースを実装(implement)した複数のクラスを、多態性(ポリモーフィズム)によって統一的に扱うことができるようになる。
逆に言えば、インタフェースはそれを実装する具象クラスに対して自身が宣言する純粋仮想関数をオーバライドすることを強制することで、各具象クラスの在り方を規定する。

入出力やAPIを表す広義の「インタフェース」との混同に注意。(いずれもソフトウェア開発では一般的に用いられる。)

抽象クラスとの違い

インタフェースは純粋仮想関数を含んでいるため、(広義の)抽象クラスである。
但し(インタフェースではない狭義の)抽象クラスとは用いられ方に差がある。
多重継承が認められているC++では、インタフェースと(狭義の)抽象クラスとの間に明確な区分は無い。
(そもそも、C++においてはインタフェースの概念自体が整備されていない。)
JavaやC#ではクラスの多重継承が認められていないが、インタフェースの多重実装は認められており、
「クラスの定義・継承」と「インタフェースの定義・実装」は明確に区別される。

インタフェースの例

インタフェースの定義

Java

(Cashier.java)
// 「レジ」インタフェース public interface ICashier { // 「会計」メソッド public void bill(); }
class ではなく interface キーワードを用いる点に注意。

C#

(Cashier.cs)
// 「レジ」インタフェース public interface ICashier { // 「会計」メソッド void bill(); }

インタフェースの実装

Java

(CreditCard.java)
// 「クレジットカード」 // インタフェース ICashier を実装 public class CreditCard implements ICashier { // 「会計」メソッドのオーバーライド @Override public void bill() { System.out.println("クレジットカードでお会計をいたします。"); } }
(Cash.java)
// 「現金」 // インタフェース ICashier を実装 public class Cash implements ICashier { // 「会計」メソッドのオーバーライド @Override public void bill() { System.out.println("現金でお会計をいたします。"); } }
implements キーワードにより、インタフェースを実装することを宣言。bill() をオーバーライド( @Override )する。

C#

(CreditCard.cs)
// 「クレジットカード」 // インタフェース ICashier を実装 public class CreditCard : ICashier { // 「会計」メソッドのオーバーライド public void bill() { Console.WriteLine("クレジットカードでお会計をいたします。"); } }
(Cash.cs)
// 「現金」 // インタフェース ICashier を実装 public class Cash : ICashier { // 「会計」メソッドのオーバーライド public void bill() { Console.WriteLine("現金でお会計をいたします。"); } }
書式はC++における継承と同様。

インタフェースの具現化

Java

(Staff.java)
// 「スタッフ」 public class Staff { public static void main(string[] arg) { // インタフェース ICashier 変数の宣言 ICashier cashier[] = new ICashier[2]; cashier[0] = new CreditCard(); cashier[1] = new Cash(); // 支払い方法(クレジットカード / 現金)を取得 int i = GetPaymentMethod(); cashier[i].bill(); } }
CreditCard 、Cash ともに ICashier を実装しているため、Staff では CreditCard 、Cash のいずれであるかを意識することなく、共通の手法で呼び出すことができる。

C#

(Staff.cs)
// 「スタッフ」 public class Staff { public static void main(string[] arg) { // インタフェース ICashier 変数の宣言 ICashier cashier[] = new ICashier[2]; cashier[0] = new CreditCard(); cashier[1] = new Cash(); // 支払い方法(クレジットカード / 現金)を取得 int i = GetPaymentMethod(); cashier[i].bill(); } }