因此,扩展方法用于向类添加功能,而无需修改其当前代码。我读过LINQ运算符是用这种方式定义的。
我的问题是,当我们知道我们希望每个实现IEnumerable的类都使用LINQ运算符时,为什么不直接在IEnumerable接口中定义LINQ运算符?为什么要使用扩展方法?
谢谢。
原因是三方面的:
架构软件的一个基本部分是理解Composition Over Inheritance的面向对象设计原理。就是说,当您构建软件时,宁愿拥有可以一起工作的乐高积木来组合所需的乐高积木,而没有乐高积木将所有这些功能内置到其继承链中。并非每个乐高积木都需要乐高滚轮的功能,但是如果您使用继承,则每个乐高积木都可以使用该功能-可能不是您想要的。
通过使用合成并设置新的扩展方法语法; Microsoft可以在Enumerable接口上添加功能,而不必担心IEnumerable的现有使用者。
IEnumerable
和IEnumerable<T>
的名称很简单:提供一种接口,用于遍历集合的通用方法。这样,从现在到以后需要迭代集合的每个人都可以使用此接口。如果他们开始向该接口添加与枚举无关的内容,那么消费者将开始感到困惑。 “这又是为了什么?”
软件开发中的另一个原则是单一职责原则(SOLID中的S,当您拥有负责两个或多个事物的类或接口时,是时候重新考虑为什么存在该接口了。