6

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

public static bool Assimilate(this List<Card> first, List<Card> 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 类,我应该创建一个继承自 List 的新类,并在该新类中实现我的“合并”方法。他是对的吗?扩展 List 类违反了 Open/Closed 原则?

4

3 回答 3

7

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

你可以用不同的语言以不同的方式扩展对象,继承只是一种方式;c# 为您提供了向现有类添加扩展方法的能力。

记住“打开以进行扩展- 关闭以进行修改”

于 2014-04-25T16:15:11.263 回答
2

如果使用扩展方法而不是子类违反了打开/关闭原则,那么按照这种逻辑,所有扩展方法都会违反它,但它们是有意添加到 C# 并在整个 .NET 框架本身中广泛使用的功能,以很多好处。(如果没有扩展方法,我们就没有 LINQ,那真是太可惜了。)

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

于 2014-04-25T16:19:06.987 回答
1

开/关原则是一项原则,而不是规定该原则在特定语言中的外观。

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

在大多数语言中,继承是进行这种扩展的唯一方法,因此开/关原则需要使用继承。C# 恰好为您提供了两种扩展技术:继承和扩展方法。两者都使用没有什么问题。

于 2014-04-25T17:13:01.793 回答