ここでは非ジェネリックなコレクション型System.Collections.CollectionBaseクラスについて解説します。 CollectionBaseクラスを使用するよりも、CollectionBaseに相当するジェネリックなコレクション型System.Collections.ObjectModel.Collection<T>クラスを使用することを強く推奨します。
CollectionBase
System.Collections.CollectionBaseクラスは、独自にコレクションクラスを実装するのに便利な抽象クラスです。 コレクションに要素を追加・挿入・削除・設定する際の動作をオーバーライドすることができます。
CollectionBaseクラスを継承して、挿入される要素の型をチェックするようにすればジェネリックコレクションのように厳密に型指定されたコレクションを作ることが可能です。 また、コレクションの内容が変更されたときにイベントを発生させてクラス外に通知する、といったことも可能になります。
CollectionBaseクラスでは内部にArrayListを持っていて、これがコレクションとしての実体となります。 派生クラスからは、Listプロパティを通してアクセスします。 また、CollectionBaseクラスでは、次のプロテクトメソッドをオーバーライドすることが出来ます。
メソッド | メソッドが呼ばれるタイミング |
---|---|
OnValidate | 内部コレクションに要素を追加・設定しようとしたとき OnSet, OnInsert, OnRemoveの各メソッドが呼ばれる前に呼び出されます |
OnSet | 内部コレクションの要素を設定しようとしたとき |
OnInsert | 内部コレクションに要素を挿入しようとしたとき |
OnRemove | 内部コレクションから要素を削除しようとしたとき |
OnClear | 内部コレクションから全要素を削除しようとしたとき |
OnSetComplete | 内部コレクションへの要素の設定が完了したとき |
OnInsertComplete | 内部コレクションへの要素の挿入が完了したとき |
OnRemoveComplete | 内部コレクションからの要素の削除が完了したとき |
OnClearComplete | 内部コレクションからの全要素の削除が完了したとき |
これらのメソッドは、派生クラスからListプロパティを通して内部コレクションにアクセスした場合と、クラス外からIListインターフェイスを経由してアクセスされた場合に呼び出されます。 派生クラスから内部コレクションにアクセスする方法としてもう一つInnerListプロパティも用意されていますが、このプロパティを通して直接内部コレクションの実体にアクセスした場合は、これらのメソッドは呼び出されません。
また、Add, Insert, Remove, ContainsなどのメソッドはCollectionBaseクラスでは提供されないため、派生クラスにて内部コレクションへの追加・削除・挿入を行うメソッドを用意する必要があります。
実装例
以下は、CollectionBaseを継承し、OnValidateメソッドをオーバーライドしてString型の値のみをコレクションに追加できるStringCollectionクラスを実装する例です。
以下は、CollectionBaseを継承し、Integer型の値のみを追加できるスタックIntStackを実装する例です。