System.Collections.ObjectModel にある Collection<T> について、ソース観点からの補足説明のようなもの。
主な用途は、継承用クラスになる。
実際、System.Collections.ObjectModel にある他クラスの継承元として使われている。
単品で使用できないこともないが、IList<T> ないし List<T> の単なるラッパになるので(Collection<T> の引数無しコンストラクタは内部で List<T> を生成)、ラップするメリットがあまりない。
List<T> の機能を制限したいなら、基本的にインターフェースへのキャストで十分。
状態変更時に挟める protected メソッドとして、ClearItems、InsertItem、RemoveItem、SetItem が用意されている。
これらと状態変更用の public メソッド・プロパティとの関係は下記
注意すべきは、Add と Insert で同じ InsertItem メソッドが使われる点。
Add(item) は Insert(Length - 1, item) として処理される。
表でも自明なように IList.Add は使用されない。
自前の IList のラッパーとする場合、IList.Add のみの特殊処理を実装していても使われないので注意。
(普通は IList.Insert と差がある実装にしないだろうけど・・・)
主な用途は、継承用クラスになる。
実際、System.Collections.ObjectModel にある他クラスの継承元として使われている。
単品で使用できないこともないが、IList<T> ないし List<T> の単なるラッパになるので(Collection<T> の引数無しコンストラクタは内部で List<T> を生成)、ラップするメリットがあまりない。
List<T> の機能を制限したいなら、基本的にインターフェースへのキャストで十分。
状態変更時に挟める protected メソッドとして、ClearItems、InsertItem、RemoveItem、SetItem が用意されている。
これらと状態変更用の public メソッド・プロパティとの関係は下記
public | protected | protectedの実装 | 備考 |
---|---|---|---|
Item (インデクサ) |
SetItem | IList[index] = item | protected メソッド実装時、index 引数の境界値チェックは不要。(public 側で実施済) |
Add | InsertItem | IList.Insert(index, item) | |
Insert | |||
Remove | RemoveItem | IList.RemoveAt(index) | |
RemoveAt | |||
Clear | ClearItems | IList.Clear() |
注意すべきは、Add と Insert で同じ InsertItem メソッドが使われる点。
Add(item) は Insert(Length - 1, item) として処理される。
表でも自明なように IList.Add は使用されない。
自前の IList のラッパーとする場合、IList.Add のみの特殊処理を実装していても使われないので注意。
(普通は IList.Insert と差がある実装にしないだろうけど・・・)
0 件のコメント:
コメントを投稿