【发布时间】:2014-05-15 18:22:08
【问题描述】:
IList 是一个接口。我刚刚开始学习泛型。而且我知道接口是类实现它承诺使用其方法的合同。所以我从没想过使用类似的值类型:
有人可以解释一下这是什么以及在使用类似类型的接口时如何考虑它的用法:
IList<Writer> someName;
我在这里创建 IList 接口的通用类型。但是接口不是一个类那么我应该如何想象它的作用?
还是我误会了什么?
【问题讨论】:
IList 是一个接口。我刚刚开始学习泛型。而且我知道接口是类实现它承诺使用其方法的合同。所以我从没想过使用类似的值类型:
有人可以解释一下这是什么以及在使用类似类型的接口时如何考虑它的用法:
IList<Writer> someName;
我在这里创建 IList 接口的通用类型。但是接口不是一个类那么我应该如何想象它的作用?
还是我误会了什么?
【问题讨论】:
如果一个成员/变量被声明为一个接口,它可以用任何实现了上述契约的类来实例化。例如,您可以用List<Writer>() 实例化someName,但不能用new IList<Writer>()。
IList<Writer> someName = new List<Writer>();
// someName can access any member of IList, but not specific members of List
【讨论】:
IList<Writer> someName;
将持有对任何实现 IList<T> 接口的类实例的引用,并将 Writer 指定为类型参数。
【讨论】:
// Returning from list
List<Writer> myWriters = new List<Writer>();
myWriters.Add(new Writer("Andy", "FL"));
myWriters.Add(new Writer("Mary", "FL"));
myWriters.Add(new Writer("Ken", "CA"));
myWriters.Add(new Writer("Robert", "WA"));
myWriters.Add(new Writer("Brian", "CA"));
IList<Writer> roWriters;
roWriters = myWriters.AsReadOnly();
我可以这样说吗?以上使用 IList 允许 myWriters 使用 .AsReadOnly();方法?否则就不可能了? .AsReadOnly();是不是 IList 本身没有 List 的方法?
【讨论】:
myWriters.AsReadOnly(),但不能使用roWriters.AsReadOnly()。你仍然可以同时使用.Add(item)。
List<Writer> roWriters,这段代码会做同样的事情。在请求参数或声明类字段时,它通常更有用。例如,一个在屏幕上打印Something列表的方法,您可以要求参数为IList<Something>,并将List<Something>或Something[]传递给它,因为两者都实现了IList<Something>。