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

时间:2014-04-25 16:09:16

标签: c# list open-closed-principle

我刚刚在其中一个课程中创​​建了以下方法

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的新类并实现我的&#34; merge&#34;新课程中的方法。 他是对的吗?扩展List类违反了开放/封闭原则?

3 个答案:

答案 0 :(得分:7)

我认为这违反了公开/关闭原则。如果我必须改变,我会考虑这个问题。用于向对象添加功能的现有代码然后我违反了打开/关闭,但是扩展对象正是您应该添加的功能。

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

请记住&#39;打开扩展程序 - 关闭以进行修改&#39;

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

开放/关闭原则是原则,而不是该原则在特定语言中应该是什么样的。

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

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