我正在审查继承,并且对继承接口有一些困惑。我们以List<T>
为例。
我有这个基本声明:
List<string> categoryList = new List<string>();
当光标位于Go to Definition
时点击List
,它会显示此代码,
public class List<T> : IList<T>, ICollection<T>, IList, ICollection,
IReadOnlyList<T>, IReadOnlyCollection<T>,
IEnumerable<T>, IEnumerable
{
}
如果我在光标位于Go to Definition
IList<T>
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
}
现在我的问题是:当List<T>
已经继承ICollection<T>
时,为什么IEnumerable<T>
仍在继承IEnumerable
,IList<T>
和{{1}}?
答案 0 :(得分:3)
我相信这只是Visual Studio代表定义的方式,它向您展示整个界面层次结构。
如果您查看Reference Source for List<T>,您会看到它只实现 IList&lt; T&gt; , System.Collections.IList 和 IReadOnlyList&lt; T&gt; ,因为实现 IEnumerable&lt; T&gt; 将是多余的。
public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
{
// bla bla bla
}
答案 1 :(得分:3)
出于可读性目的,这显然是。只需指定三个接口,代码就可以正常编译:
public class List<T> : IList<T>, IList, IReadOnlyList<T>
{
}
但是这样,您必须知道IList
继承ICollection
和IEnumerable
,IList<T>
实施ICollection<T>
和IEnumerable<T>
, IReadOnlyList<T>
继承IReadOnlyCollection<T>
。