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>实例(AFAIK,这是 LINQ 功能所做的)。这允许您更改返回对象的内部实现(它可能是链表、B-Tree 或其他),并且调用代码不需要更改。

那里的许多模拟库(例如 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 回答