1

私は次のようにオブジェクトをインスタンス化するために使用されます:

type obj-name = new type();

そして今私は使用しています

IList<string> str_element = new List<string>();

私は何かを見ることを期待していました

IList<string> actors = new IList<string>();

誰かが私にインターフェースのインスタンス化がここで異なる理由を教えてもらえますか?

ありがとう、
アミット

4

4 に答える 4

4

インターフェースはまさにそれです—インターフェース、または存在すべきメソッドの仕様。
インターフェイスには実際のコードは含まれていません。

インターフェイスは、具象クラスを保持する型としてのみ使用できます。
インスタンス化するものがないため、インターフェイスのインスタンスを作成することは意味がありません。

于 2012-08-14T23:54:08.373 に答える
3

できない= new IList<string>()理由IList<T>は、インターフェースであり、呼び出すコードがないため、インターフェースを初期化できないためです。私はすることをお勧めします

List<string> actors = new List<string>()

代わりは。

于 2012-08-14T23:54:37.350 に答える
1

インターフェースは、実装クラスが (少なくとも) 提供しなければならないコントラクト、または一連の機能を定義します。type の変数を定義することによりIList<T>、「実際の実装が何であるかは気にしません。その機能を提供する必要があるだけです」と言っているのです。これは、呼び出しコードで「インターフェース」と「実装」を分離していることを意味します。これは良いことです。

インターフェースの真の力は、プラグ可能なコードがあるところにあります。インスタンスを返すのではなく、ライブラリを定義している場合は、List<T>インスタンスを返すことができIList<T>ます (知る限り、LINQ 機能が行うことです)。これにより、返されるオブジェクトの内部実装 (リンクされたリスト、B ツリーなど) を変更でき、呼び出しコードを変更する必要はありません。

多くのモッキング ライブラリ (NMock、Moq など) はインターフェイスを利用して、テスト目的で実装クラスを生成できます。

于 2012-08-15T00:42:50.003 に答える
0

LINQを使用できます:たとえば

これにより、より具体的なタイプの何かが得られます。

using System.Linq;

IList<Foo> list = new List<Foo>();
IEnumerable<Foo> sortedEnum = list.OrderBy(f=>f.Bar);
IList<Foo> sortedList = sortedEnum.ToList()
于 2012-08-14T23:57:04.443 に答える