概要
インターフェース(interface)という言葉の意味は直訳すると「境界面」になります。 すなわち、物と物との間の仲介をする部分のことです。
例えば、PC と周辺機器をつなぐ場合、 どのような物理媒体を用いて、どういう信号を送るかといった規約を定める必要があります。 このような約束事に基づいて作られたケーブルやコネクタのことをインターフェースと呼ぶわけです。
オブジェクト指向プログラミングの世界においては、 インターフェースとはクラスが実装すべき規約(どういうメソッドにどういう引数を渡すかなど)を定めるものです。 すなわち、クラス設計者とクラス利用者の間の仲介役を担うのがインターフェースです。
ポイント
-
インターフェース: クラス外部からみた規約だけを定めるもの。「クラスの内外の境界」という意味。
-
public な抽象メソッドだけを持つクラスのようなもの。
- C# 8.0 で緩和されて、「フィールドを持てない代わりに多重継承できる」くらいの差に縮まっています
-
抽象クラスと違って、複数のインターフェースを継承できる。
-
class キーワードの代わりに interface キーワードを使う。
サンプル
-https://github.com/ufcpp/UfcppSample/tree/master/Chapters/Oop/InterfaceSample
メソッドの規約と実装
メソッドを設計する場合、規約の決定と実装という2つの段階を経ることになります。
規約あるいは契約(contract)とは、 クラス外部からみたクラス・メソッドの仕様のことで、 メソッドを設計する際、まずは規約を定める必要があります。 すなわち、規約とは「そのメソッドが何を出来るのか」、 「そのメソッドを呼び出すことで何が起こるのか」ということです。
そしてその後、定まった規約を満たすようにメソッド内部の実装(implementation)を行います。 通常、規約と実装は切り離して考えるべきです。 クラス利用側からすると、 実際にメソッドの内部実装がどうなっているかはどうでもよくて、 外部仕様さえ分かればクラスを利用できるからです。
通常のメソッドは規約と実装を同時に定めますが、 「抽象メソッド」抽象メソッドは規約のみを定め、実装は派生クラスで行うことになります。
ここで注意しなければいけないのは、複数のクラスが同じ規約を満たす場合もあるということです。 また、同じ規約であっても、クラスが異なればその実装方法も異なります。 抽象メソッドの実装は派生クラスで行いますが、 派生クラスごとに実装方法が異なります。
例えば、
「抽象メソッド、抽象クラス」で説明した Person
クラスでは、
「Age
プロパティが呼ばれたら年齢を答える」という規約を定めています。
Person
の派生クラスではこの規約に従って Age
プロパティを実装します。
クラスによって正直に答えたり、鯖を読んだりと、その実装方法は異なりますが、
「年齢を答える」という規約は満たされています。
C# のインターフェース
インターフェースとは、規約のみを定めるものです。 上述したように、C# では抽象メソッドを用いることでメソッドの規約のみを定めることが出来ます。 つまり、C# のインターフェース(interface)とは、抽象メソッドのみを持つ抽象クラスだと考えることが出来ます。
C# のインターフェースの定義は以下のようにして行います。
interface インターフェース名
{
メソッド・プロパティの宣言
}
インターフェースの実装はクラスの継承と同じ構文で行います。
class クラス名 : インターフェース名
{
クラスの定義
}
クラスとよく似ていますが、インターフェースには以下に挙げるような特徴があります。
-
メンバー変数(フィールド)を持つことが出来ない。
-
static メソッドを持つことが出来ない。
-
宣言したメソッド・プロパティはすべて
public abstract
になる。 -
1つのクラスが複数のインターフェースを実装(多重継承)できる。
Ver. 8.0
C# 8.0 では、制限がいくつか緩和されています。 後述しますが、機能面で言うと、クラス(特に抽象クラス)との差は「フィールドを持てない代わりに多重継承できる」くらいの差になっています。