因此,扩展方法用于为类添加功能,而无需修改其当前代码。我读过LINQ运算符是用这种方式定义的。

我的问题是,当我们知道每个实现IEnumerable的类都需要LINQ运算符时,为什么不直接在IEnumerable接口中定义LINQ运算符?为什么要使用扩展方法?

谢谢。

最佳答案

原因有三点:

  • 更改IEnumerable的接口对于现有使用者而言是一项重大更改。由于.NET 3.5(当引入LINQ时)并不是生产中唯一的.NET版本(当时有.NET 2.0和.NET 1.1),因此Microsoft的.NET团队在更改时必须格外小心。
  • 架构软件的一个基本部分是理解对象SOLID设计原理"the Open-Closed" principle(SOLID中的“O”)。也称为Composition Over Inheritance。就是说,当您构建软件时,宁愿拥有乐高积木,它们可以一起工作以组成您想要的乐高积木结果,而不是让乐高积木在继承链中内置所有这些功能。并非每个乐高积木都需要乐高滚轮的功能,但是如果您使用继承,则每个乐高积木都可以使用该功能-可能不是您想要的。
    通过使用组合并设置新的扩展方法语法; Microsoft可以在Enumerable接口上增加功能,而不必担心IEnumerable的现有使用者,并且这些实现都不需要实现整个LINQ运算符集,如果将它们嵌入到IEnumerable接口中,则他们将不必执行。
  • IEnumerableIEnumerable<T>的名称很简单:提供用于迭代集合的通用方法的接口。这样,从现在到以后需要遍历集合的每个人都可以使用此接口。如果他们开始向该接口添加与枚举无关的内容,那么消费者将开始感到困惑。 “这又是为了什么?”
    软件开发中的另一个原则是“单一职责原则”(即SOLID中的S),当您拥有负责两个或多个事物的类或接口时,是时候重新考虑为什么存在该接口了。
  • 10-07 13:25
    查看更多