最後に、前回の最後で作成したLinkCollectionクラスを列挙可能にしてみましょう。
■IEnumerableインターフェイスの実装
まず、LinkCollectionクラスでは次のような作業が必要となります。
LinkCollectionクラスのコードは次のようになります。今回追加したコードは太字で示しています。なお、コレクションの全要素数を取得するためのCountプロパティが未実装だったため、それも追加しています。
GetEnumeratorメソッドでは列挙用オブジェクトを作成して返します。列挙用オブジェクトのクラスの名前は「LinksEnumerator」としました。
LinksEnumeratorオブジェクト(=列挙用オブジェクト)は、LinkCollectionオブジェクトから要素を取り出す必要があるため、コンストラクタにより、現在のLinkCollectionオブジェクトの参照(thisやMe)を渡してやります。
■IEnumeraterインターフェイスを実装したクラスの作成
次に、IEnumeraterインターフェイスを実装した列挙用オブジェクトのクラスを記述します。内部データとなるフィールドとしては、現在のインデックス番号と、対象となるコレクション(LinkCollectionオブジェクト)への参照が必要となります。
このクラスはLinkCollectionクラスと関連が深いため、LinkCollectionクラスの内部で「入れ子クラス」として定義される場合がありますが、ここでは分かりやすいようにLinkCollectionクラスとは別の独立したクラスとして記述しました。
ちなみに、Visual Studio .NETには、クラスの宣言部分でインターフェイス名を列挙しただけで、そのクラスで記述しなければならないメソッドのひな形を自動的に作成してくれる機能があるため非常に便利です。
以上でLinkCollectionクラスはforeach可能となりました。これでLinkCollectionクラスは、列挙のための(クラス・ライブラリの世界における)標準インターフェイスに準拠したことになります。
これだけでは、まだインターフェイスの有用性についてピンとこない方がいるかもしれませんので、インターフェイスを学ぶための参考となる記事をいくつか挙げておきます。
IEnumerableインターフェイスと並んで比較的よく利用しそうなインターフェイスとしては、配列などの並べ替えで使用するIComparerインターフェイスがあります。これについては「.NET TIPS:配列を独自の順序でソート(並べ替え)するには?」で解説されています。
また、データベース・アクセスのためのADO.NETでは、データ・プロバイダ(SQL ServerやOracleに実際にアクセスするクラス)に依存しないように、インターフェイス・ベースでADO.NETのクラス群を利用することができます。これについては、「連載:ADO.NET基礎講座 第2回」の「インターフェイス・ベースの記述」で触れています。
全7回にわたりオブジェクト指向プログラミングの基礎を解説してきたわけですが、おそらく本連載だけを読んでもC#やVB.NETでプログラミングができるようにはなりません。その代わり、C#入門やVB.NET入門などを併読して例外やデリゲートなどの言語特有の機能を学べば、C#やVB.NETで記述されたソース・コードは何となく読めるぐらいにはなっていると思います。
あとやるべきことは、人が書いたコードをたくさん読み、それを模倣しながら自分でコードを記述し、悩み、考えることです。とにかく自分でコードを書き始めないとオブジェクト指向プログラミング(やオブジェクト指向)の難しさも素晴らしさもなかなか理解できないと思います。これを機にオブジェクト指向プログラミングの世界に足を踏み入れてみてください。
Copyright© Digital Advantage Corp. All Rights Reserved.