2009-09-08 6 views
6

IListインターフェイスにはAddメソッドが必要です。配列はこの関数を実装しますが、単にNotImplementedExceptionをスローします。これは私にとって非常に悪いデザインのようです。配列がIListをサポートするのはなぜですか?

デザイナーは何を考えていましたか?

答えて

7

IListsは読み取り専用です。呼び出し元は、要素の追加または削除を試みる前にIsFixedSizeプロパティをテストしたり、要素の修正を試みる前にIsReadOnlyプロパティをテストしたりすることはできません。

配列は固定サイズのIListです。

アレイをリストとして扱うことができれば便利です。 1つの例は、IListを返すデータアクセスメソッドを模擬することです。IListとして配列キャストを単純に返すことができます。

+1

実際にはチェックする必要のあるIsFixedSizeプロパティです。 'IsReadOnly'は配列の' false'になります。既存の要素を変更できるからです。 'IsFixedSize'は要素が追加または削除されないので' true'になります。 – LukeH

+0

固定および読み取り専用の問題を明確にするために:http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx – Oliver

+1

@Oliver:私はEric Lippertのブログの大ファンですが、その記事はIsFixedSizeまたはIsReadOnlyプロパティとはまったく関係ありません。 – LukeH

0

さまざまなオブジェクトが異なる能力を持つのが一般的であるため、一部のインターフェイスには、一部の実装で実装されるメンバーが含まれますが、すべての実装ではありません。架空のインタフェースIVehicleの一部の実装ではトレーラを接続できるようになる場合、典型的なパターンはAttachTrailerの機能を「CanAttachTrailerがtrueの場合はNotSupportedExceptionの場合はトレーラを接続しようとしています」と定義し、 。 IVehicleのすべての実装は、トレーラを処理できるかどうかに関わらず、上記の仕様に準拠することができます。

このアプローチの利点は、インターフェイスの実装でさまざまな組み合わせのさまざまなタイプを定義することなく、さまざまな機能の組み合わせを提供できることです。このアプローチのもう1つの利点は、Fooが必要としない機能を含むオブジェクトを受け取るメソッドFooが、そのオブジェクトをどこでも型キャストを必要とせずにメソッドBarに渡すことが可能であり、 Fooの機能を知ることなしにはBarに必要となります。さらに別の利点は、これにより、特定の機能を必要としないコードを書くことが容易になるが、存在するときにそれらを利用できることである。

ただし、このアプローチにはいくつかの欠点があります。インターフェイスでは、プロパティやメソッドのデフォルトの実装を指定する方法はまだありません。したがって、IVehicleの実装でも、予告編を添付できない場合はfalseCanAttachTrailerプロパティに返すコードを組み込み、AttachTrailerメソッドで例外をスローする必要があります。さらに、インタフェースは、そのメソッドの多くが実装される必要がないため、コンパイラは、それを提供できない型のオブジェクトを持つ機能を必要とする関数を呼び出す試みを拒否することを知ることができません。

IList<T>を設計するとき、マイクロソフトは明らかに「オプション機能インターフェイス」アプローチの利点が欠点を上回っていると考えました。実際、.netがインターフェイスを実装しているクラスが提供したくないメンバーのデフォルト実装を延期する手段を提供した場合、ベースレベルのインターフェイスに多くのオプション機能を含まない理由はほとんどありません。必要な機能のコンパイル時の実行を可能にするために、必要なすべてのメンバーを含むベースから派生した多数のインターフェースを持つことができ、後者のインターフェースを実装するクラスが特定のメンバーを実際に有用な方法で実装しなければならないことを指定します。例えば、Microsoftは、IList<T>を継承するためにメンバーを追加せずにIResizableList<T>を継承すると定義できましたが、サイズ変更を許可する実装ではIList<T>の実装では後者のインターフェイスが実装され、サイズ変更を許可しない実装では実装されません。リストをサイズ変更できるようにする必要のあるコードでは、IResizableList<T>(配列を受け入れることはできません)が要求されましたが、リストのサイズを変更する必要のないコードではIList<T>が必要でした。残念ながら、マイクロソフトではこのようなことはしていないため、コンパイル時にサイズ変更可能なリストを要求することはできません。渡されたリストが固定サイズとして報告された場合、それは可能です。

関連する問題