当基接口已经继承了接口时,为什么又继承了它?

本文关键字:继承 接口 为什么 | 更新日期: 2023-09-27 18:18:18

我正在回顾继承,对继承接口有一些困惑。以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
{
}

如果光标在IList<T>上,我再次点击Go to Definition

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
}

现在我的问题是:为什么IList<T>已经继承了ICollection<T>IEnumerable<T>IEnumerable, List<T>还在继承?

当基接口已经继承了接口时,为什么又继承了它?

我相信这就是Visual Studio表示定义的方式,它向您展示了整个接口层次。

如果您查看List的参考源代码,您将看到它只实现了IListSystem.Collections。IListIReadOnlyList,因为实现IEnumerable是多余的。

public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
{
    // bla bla bla
}

这显然是出于可读性的考虑。只要指定三个接口,代码就可以很好地编译:

public class List<T> : IList<T>, IList, IReadOnlyList<T>
{
}

但是这样,你必须知道,IList继承了ICollectionIEnumerable, IList<T>实现了ICollection<T>IEnumerable<T>, IReadOnlyList<T>继承了IReadOnlyCollection<T>