为什么 IList 实现 IEnumerable 和 ICollection 而 ICollection 本身实现 IEnumerable [重复]

2024-01-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 抱怨“冗余接口”。

微软为什么继续实施这个方案,你有什么想法吗?


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

通过重复接口声明来添加该需求不会改变任何内容,您已经有了该需求并且添加额外的需求没有任何区别。因此,既然这并不重要,微软就只是重复该接口,这样你就可以一下子就知道哪些接口是由 List 实现的。您不必深入查看接口声明即可看到 List 也实现了 IEnumerable。这是一种自记录的编码风格,推荐使用。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 IList 实现 IEnumerable 和 ICollection 而 ICollection 本身实现 IEnumerable [重复] 的相关文章

随机推荐