扩展List 并违反开放/封闭原则

我刚刚在我的一个类中创建了以下方法

public static bool Assimilate(this List first, List second) { // Trivial if (first.Count == 0 || second.Count == 0) { return false; } // Sort the lists, so I can do a binarySearch first.Sort(); second.Sort(); // Copia only the new elements int index; for (int i = 0; i < second.Count; i++) { index = first.BinarySearch(second[i]); if (index < 0) { first.Insert(~index, second[i]); } } // Edit second = null; return true; } 

我的一个朋友,审查我的代码,说我不应该创建’扩展List类’的方法,因为这违反了开放/封闭原则。 如果我想扩展类List,我应该创建一个inheritance自List的新类,并在该新类中实现我的“merge”方法。 他是对的吗? 扩展List类违反了开放/封闭原则?

我不认为这违反了开/关原则。 我考虑的是,如果我必须“更改”现有代码以向对象添加function,那么我违反了打开/关闭,但扩展对象正是您应该做的添加function。

你可以用不同的语言以不同的方式扩展对象,inheritance只是一种方式; c#使您能够将扩展方法添加到现有类。

记住’开放扩展 – 关闭修改’

如果使用扩展方法而不是子类违反了开放/封闭原则,那么通过该逻辑,所有扩展方法都会违反它,但它们是有意添加到C#并在整个.NET框架本身广泛使用的特性,好处多少 (没有扩展方法,我们就没有LINQ,这将是一个真正的耻辱。)

扩展方法不会修改类本身(在修改其代码方面)或其任何现有function,因此它不违反开放/封闭原则。

开放/封闭原则是一个原则 ,而不是该原则在特定语言中应该是什么样的任务。

基本原则是,为了创建健壮,灵活的对象层次结构,可以扩展基本接口,但不应对其进行任意修改。

在大多数语言中,inheritance是进行此类扩展的唯一方法,因此开放/封闭原则需要使用inheritance。 C#恰好为您提供了两种扩展技术:inheritance和扩展方法。 使用它们都没有错。