【问题标题】:Why does IList<T> implement IEnumerable<T> and ICollection<T> while ICollection<T> itself implements IEnumerable<T> [duplicate]为什么 IList<T> 实现 IEnumerable<T> 和 ICollection<T> 而 ICollection<T> 本身实现 IEnumerable<T> [重复]
【发布时间】:2015-03-20 06:44:02
【问题描述】:

为什么 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>

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

public interface IOne
{
    string One();
}

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

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

Resharper 虽然非常好,但抱怨“冗余接口”。

有什么想法为什么 Microsoft 继续执行此实施?

【问题讨论】:

  • 你在哪里看到重复的? (可以这么说IList&lt;T&gt;的来源是什么?)
  • @JonSkeet:刚刚在IList&lt;T&gt; 上按下F12 / Go to definition。它向我展示了来自assembly metadatamethod signature。刚从那里看过。
  • 顺便说一句,只对真正的代码使用反引号很有帮助。 (我已经编辑了你帖子中的多余部分)
  • @JonSkeet:谢谢乔恩。会更正
  • 以防万一您想知道,我已经删除了我的答案,因为我认为它是不正确的 - 我怀疑代码真的 在它被编译了。我真的无法推测为什么……我猜是写界面的人的个人喜好。

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


【解决方案1】:

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

通过重复接口声明添加到该需求不会改变任何东西,您已经有了需求,添加额外的需求没有任何区别。因此,既然这无关紧要,微软只会重复接口,这样你就可以一举说出哪些接口是由 List 实现的。您不必深入到接口声明即可看到 List 也实现了 IEnumerable。这是一种自我记录的编码风格,推荐。

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

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

【讨论】:

  • 好点 => 推荐自我记录风格。
  • 谢谢@Hans。此外,Eric Lippert 在这里很好地解释了这一点http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx#comments
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多