ここではインターフェイスの定義方法と実装方法についてごく簡単に解説しておきます。というのも、インターフェイス自体を自分で定義したり、実装したりということは初心者のうちはほとんどないからです。
まずインターフェイスの定義方法ですが、例えばIListインターフェイスの場合には、その定義はおおよそ次のようになっています*2。.NET Frameworkのクラス・ライブラリにはこのコードがコンパイルされて納められています。
*2 実際にはIListインターフェイスは、ICollecitonインターフェイスやIEnumerableインターフェイスを継承しています。この場合、インターフェイスが定義するメソッドには、継承元となる「基本インターフェイス」で定義されているメソッドも暗黙的に含まれることになります。
前述したように、インターフェイスの定義は、オブジェクトに対して呼び出し可能なメソッド(およびプロパティ)の一覧を定義しているだけのシンプルなものです。基本的に、それ以上のことは記述できません。
一方、IListインターフェイスを実装しているArrayListクラスの定義は次のような感じになります。
クラスが実装するインターフェイスは、そのインターフェイス名をクラスの宣言部分に列挙します。VB.NETではImplementsステートメントを使用します。「implement」はまさに「実装する」という意味です。
1つのクラスには複数のインターフェイスを実装できます。最近の外付けハードディスクや外付けDVDドライブなどが、USBインターフェイスだけでなく、IEEE 1394インターフェイスも備えているようなものです。
そしてクラスでは、そのインターフェイスで定義されているメソッドの中身をすべて記述する必要があります。VB.NETの場合はさらに、メソッド名の後ろの部分にImplementsステートメントを使って、実装しているインターフェイスのメソッドを指定しなければなりません(ただしこの指定があるため、メソッドにはインターフェイスで定義されたメソッドと異なる名前を付けることができます)。
このようにクラスの宣言部分にインターフェイス名を記述し、そのインターフェイスで定義されているメソッドの中身を記述することを「クラスにインターフェイスを実装する」といいます。
特にC#では、インターフェイス名の列挙部分は、クラスの継承を行うときの基本クラスの指定と似ています。基本クラスは1つしか指定できないため、カンマ以降(ICollectionとIEnumerableとICloneable)は実装するインターフェイスであると分かります。しかし「IList」が基本クラスなのかインターフェイスなのかは、実際にはこの部分を見ただけでは判断できません。
ただし、すでにお気付きのように、インターフェイスを定義する場合には、インターフェイス名の先頭1文字をInterfaceの「I」にするというルール*3があります。
*3 このルールは、リファレンス・マニュアルのインターフェイスの名前付けのガイドラインに記述されています。
上述したインターフェイスの定義も、抽象メソッドのみを持った抽象クラスと似ています(抽象メソッドや抽象クラスは第5回で解説しています)。実際、抽象クラスを使っても、インターフェイスを使っても、ほぼ同じ仕組みをコーディングできる場合があり、その使い分けは簡単でない場合もあります*4。
*4 これに関しては、リファレンス・マニュアルでは抽象クラスとインターフェイスに関する推奨事項で解説されています。
リファレンス・マニュアルを検索してクラスの定義を調べるときには、そのクラスがどのようなインターフェイスを実装しており、また、そのインターフェイスを実装しているクラスにはどのようなものがあるのかに注目してみてください。どのような切り口でインターフェイスの機能を決めるべきかの参考になると思います。
いまインターフェイスと抽象クラスの定義方法や、クラス定義時のインターフェイスと基本クラスの指定方法が似ているということを説明しましたが、ポリモーフィズムに関してもインターフェイスとクラスは似ています(ポリモーフィズムについても第5回で解説しています)。
インターフェイスを実装しているクラスは、そのインターフェイスの型の変数にキャストなしで代入することができます。
例えば、先ほどの、
は、次のように書き換えることができます。
また、
は、次のように書き換えることができます。
あるいは、IListインターフェイスを実装したオブジェクトをパラメータとして受け取る次のようなメソッドが記述できます。このメソッドのパラメータには、上記のmyArrayやbutton1を渡すことができます。
このメソッドは、パラメータで渡されたオブジェクトがリストであるという特徴に基づいて何らかの処理を行います。もちろん、このメソッドでパラメータとなっているオブジェクトに対して呼び出し可能なメソッドは、IListインターフェイスで定義されたメソッドだけです。
この例はあまり良い例ではないので、いまいちピンとこないかもしれません。次にもう少し身近な例を挙げてインターフェイスの威力を見てみましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.