++C++; // 未確認飛行 C

Google
Web ufcpp.net

インターフェース

目次

キーワード

概要

インターフェース(interface)という言葉の意味は直訳すると「境界面」になります。 すなわち、物と物との間の仲介をする部分のことです。

例えば、PC と周辺機器をつなぐ場合、 どのような物理媒体を用いて、どういう信号を送るかといった規約を定める必要があります。 このような約束事に基づいて作られたケーブルやコネクタのことをインターフェースと呼ぶわけです。

オブジェクト指向プログラミングの世界においては、 インターフェースとはクラスが実装すべき規約を定めるものです。 すなわち、クラス設計者とクラス利用者の間の仲介役を担うのがインターフェースです。

メソッドの規約と実装

メソッドを設計する場合、規約の決定と実装という2つの段階を経ることになります。

規約あるいは契約(contract)とは、 クラス外部からみたクラス・メソッドの仕様のことで、 メソッドを設計する際、まずは規約を定める必要があります。 すなわち、規約とは「そのメソッドが何を出来るのか」、 「そのメソッドを呼び出すことで何が起こるのか」ということです。

そしてその後、定まった規約を満たすようにメソッド内部の実装(implementation)を行います。 通常、規約と実装は切り離して考えるべきです。 クラス利用側からすると、 実際にメソッドの内部実装がどうなっているかはどうでもよくて、 外部仕様さえ分かればクラスを利用できるからです。

通常のメソッドは規約と実装を同時に定めますが、 抽象メソッド抽象メソッドは規約のみを定め、実装は派生クラスで行うことになります。

ここで注意しなければいけないのは、複数のクラスが同じ規約を満たす場合もあるということです。 また、同じ規約であっても、クラスが異なればその実装方法も異なります。 抽象メソッドの実装は派生クラスで行いますが、 派生クラスごとに実装方法が異なります。

例えば、 「抽象メソッド、抽象クラス」 で説明した Person クラスでは、 「Age プロパティが呼ばれたら年齢を答える」という規約を定めています。 Person の派生クラスではこの規約に従って Age プロパティを実装します。 クラスによって正直に答えたり、鯖を読んだりと、その実装方法は異なりますが、 「年齢を答える」という規約は満たされています。

C# のインターフェース

インターフェースとは、規約のみを定めるものです。 上述したように、C# では抽象メソッドを用いることでメソッドの規約のみを定めることが出来ます。 つまり、C# のインターフェース(interface)とは、抽象メソッドのみを持つ抽象クラスだと考えることが出来ます。

図1: インターフェース

C# のインターフェースの定義は以下のようにして行います。

interface インターフェース名
{
  メソッド・プロパティの宣言
}

インターフェースの実装はクラスの継承と同じ構文で行います。

class クラス名 : インターフェース名
{
  クラスの定義
}

クラスとよく似ていますが、インターフェースには以下に挙げるような特徴があります。

  • メンバ変数を持つことが出来ない。
  • static メソッドを持つことが出来ない。
  • 宣言したメソッド・プロパティはすべて public abstract になる。
  • 1つのクラスが複数のインターフェースを実装できる。

標準クラスライブラリ中のインターフェース

.NET Framework の標準クラスライブラリでは、汎用性の高いいくつかのインターフェースを標準で用意しています。 ここでは、そのうちのいくつかを紹介します。

インターフェース名説明
System.IComparable 大小比較が可能なクラスはこのインターフェースを実装する。
System.ICloneable インスタンスのクローン作成が可能なクラスはこのインターフェースを実装する。
System.IDisposable 確保したリソース(HDD上のファイル等)の破棄が必要なクラスはこのインターフェースを実装する。
System.Collections.IEnumerable 配列のように複数の要素を持っていて、その要素を列挙可能なクラスはこのインターフェースを実装する。

演習問題

問題 1

多態性問題 1Figure クラスをインターフェース化せよ。

TriangleFigure 関係の例題は一応、これで完成形。

余力があれば、楕円、長方形、平行四辺形、(任意の頂点の)多角形等、さまざまな図形クラスを作成せよ。 また、これらの図形の面積と周の比を計算するプログラムを作成せよ。

解答

Transtation into English

[お問い合わせ](q)