6

クラスの1つで次のメソッドを作成しました

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

これはオープン/クローズの原則に違反しているとは思いません。オブジェクトに機能を追加するために既存のコードを「変更」する必要がある場合、オープン/クローズに違反していますが、オブジェクトを拡張することはまさに機能を追加するために行うべきことです。

さまざまな言語でさまざまな方法でオブジェクトを拡張できます。継承は 1 つの方法にすぎません。c# は、拡張メソッドを既存のクラスに追加する機能を提供します。

「拡張用に開く- 変更用に閉じる」を覚えておいてください

于 2014-04-25T16:15:11.263 に答える
2

サブクラスではなく拡張メソッドを使用することがオープン/クローズの原則に違反する場合、そのロジックによってすべての拡張メソッドが違反しますが、それらは意図的に C# に追加され、.NET フレームワーク自体全体で広く使用されている機能です。多くの利益。(拡張メソッドがなければ、LINQ はありません。それは本当に残念なことです。)

拡張メソッドは、(そのコードを変更するという点で) クラス自体を変更したり、既存の機能を変更したりしないため、オープン/クローズの原則に違反しません。

于 2014-04-25T16:19:06.987 に答える
1

オープン/クローズの原則は原則であり、その原則が特定の言語でどのように見えるべきかという義務ではありません。

根底にある原則は、堅牢で柔軟なオブジェクト階層を作成するために、基本インターフェースを拡張できますが、勝手に変更してはならないということです。

ほとんどの言語では、継承がこの種の拡張を行う唯一の方法であるため、オープン/クローズの原則では継承を使用する必要があります。C# では、継承メソッドと拡張メソッドという 2 つの拡張手法が提供されています。両方使っても問題ありません。

于 2014-04-25T17:13:01.793 に答える