实例化和接口

时间:2012-08-14 23:52:18

标签: c# oop

我习惯将对象实例化如下:

type obj-name = new type();

现在我正在使用

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

我期待看到一些东西

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

有人可以给我一些想法,为什么界面实例化在这里有所不同?

谢谢,
阿米特

4 个答案:

答案 0 :(得分:4)

接口只是 - 接口或应该存在哪些方法的规范 接口不包含任何实际代码。

接口只能用作包含具体类的类型 创建接口实例没有意义,因为没有任何实例化。

答案 1 :(得分:3)

您无法执行= new IList<string>()的原因是因为IList<T>是一个接口而您无法初始化接口,因为没有可调用的代码体。我会推荐做

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

代替。

答案 2 :(得分:1)

接口定义实现类必须提供的契约或功能集(至少)。通过定义类型IList<T>的变量,您实际上是在说,“我不关心实际实现是什么,它只需要提供该功能。”这意味着你正在调用你的调用代码中的'interface'和'implementation',这是一件好事。

接口的真正威力在于您拥有可插拔代码。如果您正在定义库,而不是返回List<T>实例,则可以返回IList<T>实例(其中AFAIK是LINQ功能所做的)。这允许您更改返回的对象的内部实现(它可能是链接列表,或B树,或其他),并且调用代码不需要更改。

很多模拟库(例如NMock,Moq等)利用接口并可以生成用于测试目的的实现类。

答案 3 :(得分:0)

您可以使用LINQ:例如

这将为您提供更具体的类型。

using System.Linq;

IList<Foo> list = new List<Foo>();
IEnumerable<Foo> sortedEnum = list.OrderBy(f=>f.Bar);
IList<Foo> sortedList = sortedEnum.ToList()