C#で、オブジェクト指向を勉強しています。
以前から疑問に思っていることがあり、質問させていただきます。
ICollection<T>とCollection<T>を分離する理由が分かりません。
Collection<T>だけでもいいのではないでしょうか?
インターネットでいろいろ調べてみましたが、納得できる理由が分かりません。
MSDNにあるガイドラインのどれにも適合していないように思います。
・いくつかの値型を含む型のセットによって一定の共通機能をサポートする必要がある場合は、インターフェイスを定義してください。
・マーカー インターフェイス (メンバーを含まないインターフェイス) の使用は避けてください。
インターフェイスの実装である型を少なくとも 1 つ提供してください。
・定義した各インターフェイスを使用するメンバー (インターフェイスをパラメーターとして受け取るメソッドやインターフェイスとして型指定されたプロパティなど) を少なくとも 1 つ提供してください。
・既に提供済みのインターフェイスにはメンバーを追加しないでください。
・値型のポリモーフィックな階層構造を提供する必要がある場合は、インターフェイスを定義してください。
・多重継承と同様の効果を実現する場合は、インターフェイスを定義するようにしてください。
また、MSDN「抽象化の実装用の基本クラス」を読む限り、インターフェースはむしろ実装を煩雑化しているのではないかとさえ思えます。
その一方で、.NET Frameworkにおいては、ICollection-Collectionのみならず、IAsyncResult-AsyncResult、IList-Listといった、インターフェースと実装のペアがいくつか見られます。
このようなペアは、一見実装を煩雑化させているように見えます。
わざわざこのようなことをしている理由について、私なりに考えてみましたが、これくらいしか思い浮かびませんでした。
- コンポジションを利用してあるクラスをコレクションとして振る舞わせたい時に、ICollection<T>はその実装を保証(具体的に言うとキャスト可能にする)するだけでなく、クラスにCollection<T>以外のクラスを継承することを許可する
- 実装を持たないインターフェースを提供することにより、コレクションの内部振る舞いを完全に隠蔽かつ抽象化する。例えば、データを内部で配列として保持しようがマップとして保持しようが、同一のインターフェースからコレクションを利用可能にする(実際、Dictionary<K,V>はICollection<KeyValuePair<K,V>>を実装しています)
前述の理由が認められるならば他のすべてのクラスにもインターフェースとのペアを作らなければいけないと思ったのですが、ICollectionなどは、.NET Frameworkにおいて極めて重要なクラスであるため、特別に定義と実装を分離しているように思えます。
しかし、本当に重要度が高いのが理由なのでしょうか?
ICollectionとCollectionのように、わざわざ定義と実装が分離されたインターフェース・クラスのペアが複数存在する理由について、皆様のお考えと、もしあれば実例をお聞きできないかと思い、質問いたします。
オブジェクト指向について初歩的な質問で申し訳ありませんが、どうぞよろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。