ホームに戻る
出典 :
関連 :
目次 :
(オブジェクト指向言語における)インタフェースとは
入出力の形式のみを定めた、実装を持たない抽象型のこと。即ち、引数と戻り値のみを定めた純粋仮想関数のみを有するクラスを指す。
共通のインタフェースを実装(implement)した複数のクラスを、多態性(ポリモーフィズム)によって統一的に扱うことができるようになる。
逆に言えば、インタフェースはそれを実装する具象クラスに対して自身が宣言する純粋仮想関数をオーバライドすることを強制することで、各具象クラスの在り方を規定する。
入出力やAPIを表す広義の「インタフェース」との混同に注意。(いずれもソフトウェア開発では一般的に用いられる。)
抽象クラスとの違い
インタフェースは純粋仮想関数を含んでいるため、(広義の)抽象クラスである。
但し(インタフェースではない狭義の)抽象クラスとは用いられ方に差がある。
- (狭義の)抽象クラス : 具象クラスとの関係は is-a
「具象クラス(リンゴ)は抽象クラス(果物)(の具体例)である」
- インタフェース : 実装クラスとの関係は part-of
「インタフェース(車輪)は実装クラス(クルマ、バイク)の一部(部品)である」
多重継承が認められている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();
}
}