IListインターフェイスにはAddメソッドが必要です。配列はこの関数を実装しますが、単にNotImplementedExceptionをスローします。これは私にとって非常に悪いデザインのようです。配列がIListをサポートするのはなぜですか?
デザイナーは何を考えていましたか?
IListインターフェイスにはAddメソッドが必要です。配列はこの関数を実装しますが、単にNotImplementedExceptionをスローします。これは私にとって非常に悪いデザインのようです。配列がIListをサポートするのはなぜですか?
デザイナーは何を考えていましたか?
IListsは読み取り専用です。呼び出し元は、要素の追加または削除を試みる前にIsFixedSizeプロパティをテストしたり、要素の修正を試みる前にIsReadOnlyプロパティをテストしたりすることはできません。
配列は固定サイズのIListです。
アレイをリストとして扱うことができれば便利です。 1つの例は、IListを返すデータアクセスメソッドを模擬することです。IListとして配列キャストを単純に返すことができます。
さまざまなオブジェクトが異なる能力を持つのが一般的であるため、一部のインターフェイスには、一部の実装で実装されるメンバーが含まれますが、すべての実装ではありません。架空のインタフェースIVehicle
の一部の実装ではトレーラを接続できるようになる場合、典型的なパターンはAttachTrailer
の機能を「CanAttachTrailer
がtrueの場合はNotSupportedException
の場合はトレーラを接続しようとしています」と定義し、 。 IVehicle
のすべての実装は、トレーラを処理できるかどうかに関わらず、上記の仕様に準拠することができます。
このアプローチの利点は、インターフェイスの実装でさまざまな組み合わせのさまざまなタイプを定義することなく、さまざまな機能の組み合わせを提供できることです。このアプローチのもう1つの利点は、Foo
が必要としない機能を含むオブジェクトを受け取るメソッドFoo
が、そのオブジェクトをどこでも型キャストを必要とせずにメソッドBar
に渡すことが可能であり、 Foo
の機能を知ることなしにはBar
に必要となります。さらに別の利点は、これにより、特定の機能を必要としないコードを書くことが容易になるが、存在するときにそれらを利用できることである。
ただし、このアプローチにはいくつかの欠点があります。インターフェイスでは、プロパティやメソッドのデフォルトの実装を指定する方法はまだありません。したがって、IVehicle
の実装でも、予告編を添付できない場合はfalse
をCanAttachTrailer
プロパティに返すコードを組み込み、AttachTrailer
メソッドで例外をスローする必要があります。さらに、インタフェースは、そのメソッドの多くが実装される必要がないため、コンパイラは、それを提供できない型のオブジェクトを持つ機能を必要とする関数を呼び出す試みを拒否することを知ることができません。
IList<T>
を設計するとき、マイクロソフトは明らかに「オプション機能インターフェイス」アプローチの利点が欠点を上回っていると考えました。実際、.netがインターフェイスを実装しているクラスが提供したくないメンバーのデフォルト実装を延期する手段を提供した場合、ベースレベルのインターフェイスに多くのオプション機能を含まない理由はほとんどありません。必要な機能のコンパイル時の実行を可能にするために、必要なすべてのメンバーを含むベースから派生した多数のインターフェースを持つことができ、後者のインターフェースを実装するクラスが特定のメンバーを実際に有用な方法で実装しなければならないことを指定します。例えば、Microsoftは、IList<T>
を継承するためにメンバーを追加せずにIResizableList<T>
を継承すると定義できましたが、サイズ変更を許可する実装ではIList<T>
の実装では後者のインターフェイスが実装され、サイズ変更を許可しない実装では実装されません。リストをサイズ変更できるようにする必要のあるコードでは、IResizableList<T>
(配列を受け入れることはできません)が要求されましたが、リストのサイズを変更する必要のないコードではIList<T>
が必要でした。残念ながら、マイクロソフトではこのようなことはしていないため、コンパイル時にサイズ変更可能なリストを要求することはできません。渡されたリストが固定サイズとして報告された場合、それは可能です。
実際にはチェックする必要のあるIsFixedSizeプロパティです。 'IsReadOnly'は配列の' false'になります。既存の要素を変更できるからです。 'IsFixedSize'は要素が追加または削除されないので' true'になります。 – LukeH
固定および読み取り専用の問題を明確にするために:http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx – Oliver
@Oliver:私はEric Lippertのブログの大ファンですが、その記事はIsFixedSizeまたはIsReadOnlyプロパティとはまったく関係ありません。 – LukeH