C# コレクションクラスを自作してみる(2/2)

   

C# コレクションクラスを自作してみる(1/2)」で、今回作成する自作コレクションクラスに必要なものを準備しました。
(準備しないと、今回のコレクションクラスは動きません)

自作コレクションクラス本体を作成していきます。

 

コレクションクラスに必要な実装

前回も書きましたが、もう一度おさらい

  • int ICollection.Countプロパティ
  • object ICollection.SyncRootプロパティ
  • bool ICollection.IsSynchronizedプロパティ
  • void ICollection.CopyTo(Array list, int index)メソッド
  • IEnumerator IEnumerable.GetEnumerator()メソッド

それぞれ下記のようなものです。

 

int ICollection.Countプロパティ

このコレクションクラスで保有する要素の数を返すプロパティ

 

object ICollection.SyncRootプロパティ

アクセスを同期するために使用できるオブジェクトを返すプロパティ
このプロパティは常に現在のインスタンスを返します。

 

bool ICollection.IsSynchronizedプロパティ

アクセスが同期されている (スレッド セーフである) かどうかを示す値を返すプロパティ
アクセスが同期されている (スレッド セーフである) 場合は true。それ以外の場合は false。

 

void ICollection.CopyTo(Array list, int index)メソッド

要素を Array にコピーします。Array の特定のインデックス(‘index’)からコピーが開始されるように実装します。

 

IEnumerator IEnumerable.GetEnumerator()メソッド

コレクションを反復処理する列挙子を返します。

 

コレクションクラス本体の実装

説明文を見ていると実装がややこしそうに思えますが、実際の実装はあまり複雑ではありません。

上記のプロパティとメソッドをメインとして実装すると下記のようになります。

 

 

インターフェースに必要なものだけ実装すると、ビルドは通るのですが、使えません。

それは、この状態ではコレクションクラスが管理する”データ本体”を扱えないからです。

管理する”データ本体”は、仕様や設計などで多様な実現方法があることもあり、ICollectionクラスには用意されていません。

管理する”データ本体”を扱うためのメソッド

このサンプルのコレクションクラスで管理する”データ本体”は「ArrayList _list」です。

このデータ本体にアクセスするためのメソッドして「追加(Add)」と「削除(Remove)」を追加します。

 

追加(Add)

 

削除(Remove)

 

削除のほうにはインデックスの範囲外チェックを入れています。

これで自作のコレクションクラスができました。

 

テストプログラムで動作チェック

ここでは、自作のコレクションクラスがforeachで反復処理されるかを見るだけとします。

 

 

 

 

 - 未分類