为什么IList <t>实现IEnumerable <t>和ICollection <t>而ICollection <t>本身实现IEnumerable <t> </t> </t> </t> </t> </t>

时间:2015-03-20 06:44:03

标签: 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>

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

public interface IOne
{
    string One();
}

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

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

尽管它完全没问题,但Resharper抱怨“冗余接口”。

为什么微软继续这种实现的想法?

1 个答案:

答案 0 :(得分:10)

接口&#34;继承&#34;是软件工程中最具误导性的术语之一。你没有继承下蹲,接口没有任何实现,所以你也不能继承它。您只能继承 demand 来实现这些方法。

通过重复界面声明来增加这种需求并没有改变任何东西,你已经有了需求并且增加额外的需求没有任何区别。所以,因为它并不重要,微软有助于重复界面,因此您可以一举说出哪些接口是由List实现的。您不必深入查看接口声明,以查看List是否也实现了IEnumerable。这是一种自我记录的编码风格,推荐。

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

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