c# - 为什么 IList<T> 实现 IEnumerable<T> 和 ICollection<T> 而 ICollection<T> 本身实现 IEnumerable<T>

标签 c# .net generic-list ilist generic-collections

<分区>

为什么IList是这样定义的?

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

public interface ICollection<T> : IEnumerable<T>, IEnumerable

public interface IEnumerable<T> : IEnumerable

不就是这样吗

public interface IList<T> : ICollection<T>

所以,为了测试我创建了这些接口(interface),只是为了确定它是否有效!

public interface IOne
{
    string One();
}

public interface ITwo : IOne
{
    string Two();
}

public interface IThree : ITwo, IOne
{
    string Three();
}

虽然它非常好,但 Resharper 提示“冗余接口(interface)”。

对于 Microsoft 继续进行此实现的任何想法?

最佳答案

接口(interface)“继承”是软件工程中最具误导性的术语之一。你没有继承 squat,接口(interface)没有任何实现,所以你也不能继承它。您只需继承需求来实现方法。

通过重复接口(interface)声明来添加该需求不会改变任何内容,您已经有了需求,添加额外的需求也没有任何区别。因此,既然这无关紧要,Microsoft 只是有用地重复了接口(interface),这样您就可以一口气知道哪些接口(interface)是由 List 实现的。您不必深入到接口(interface)声明就可以看到 List 也实现了 IEnumerable。这是一种 self 记录的编码风格,推荐。

请注意这枚勋章的另一面,两个具有完全相同方法的不同接口(interface)可以通过 单个 方法实现来实现。虽然这通常很有用,但有时这并不是您想要的。比方说,ICowboy 和 IPainter,它们都有一个 Draw() 方法。它不应该做同样的事情 :) 然后您必须回退到显式实现以避免歧义。

解决 Resharper 投诉,这当然不是很有帮助。 Resharper 倾向于假设程序员最坏的情况。但是如果你想关闭它那么你需要从 IThree 继承列表中删除 IOne,这是多余的。对于实现 IThree 的类也是如此,您还需要从继承列表中删除 ITwo 和 IOne。或者只是关闭警告。

关于c# - 为什么 IList<T> 实现 IEnumerable<T> 和 ICollection<T> 而 ICollection<T> 本身实现 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29160889/

相关文章:

c# - Google API - Calendar API 正在运行,但 Gmail API 返回 '' unauthorized_client”

c# - 如何在 .Net2.0 中过滤通用列表?

delphi - 如何在 Delphi 调试期间查看通用 tList

c# - 在不使用序列化的情况下将字符串数组持久化到流中的可能方法?

C#接口(interface)实现关系只是 "Can-Do"关系?

c# - Linq to SQL - 从两个表返回记录详细信息

c# - 为什么要在 List<T>.AddRange(IEnumerable<T>) 中添加额外的副本?

c# - 在 Visual Studio 2012 中管理引用

c# - 为什么这行代码不起作用?

c# - 如何处理实现多个接口(interface)的对象的 Dtos?