.NET 1.1で密封されたクラスを拡張するクリーン/直感的なアプローチとは何ですか?

StackOverflow https://stackoverflow.com/questions/1046405

質問

私は、製品の複数のリリースで使用されるライブラリーを設計する過程にいるよ、と私たちはしているので、その仕事の一部は、.NET 1.1に存在しない機能の一部を補強することですそれを使用するために必要。おそらく、この最良の例は、その機能が、我々はかなり大きく依存しているString.IsNullOrEmpty方法、です。

.NETでStringクラスが封止されています。私は、元の文字列をラップすることにより、クラスの機能を拡張するアダプタやデコレータのパターンのいずれかを使用する方法について考えてきましたが、私はこれは私が何をしようとしているため非常に直感的なアプローチであることを確信していません。私も<のhref = "https://stackoverflow.com/questions/657503/how-to-handle-a-class-you-want-to-extend-which-is-sealed-in-theを見てきました-netライブラリ」> StackOverflowの上の別のポストは、同様の質問についてし、それが再び私が言及した問題を提起します。

私は間違いなく私が探している機能を作成するためにアダプタを使用することができますが、私はすべての文字列のためにこれをやって想像することはできません。

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty();
if (isEmpty)
{
    // Do something
}

私は必ずしもこのアプローチを嫌いしませんが、それは別の解決策が良いかもしれないメモリ管理の多くにつながるように思えます。また、私はそのアプローチが遠く、私は従うしたいオブジェクト指向設計から私を要するため、「StringUtility」ライブラリの作成に夢中ではないよ。

任意の入力は参考になります。私はクレイジーだと、これらのアプローチのいずれかを使用する必要がある場合、私に知らせてください。私はいくつか持っているので、私は、ソリューションよりもベストプラクティスのためのより多くのを探しています。

役に立ちましたか?

解決

私は個人的に静的IsNullOrEmpty方法で「StringUtility」ライブラリを好むだろう。本質的には、あなたは拡張メソッドを呼び出すための素敵な構文なしに作成されるだろうそれら。

他のヒント

定義では、何のクリーンなアプローチはありません。私は、アダプタのアプローチを使用すると、.NET 1.1でできる最善だと思います。もちろん、これは外の世界を扱うときに行き来していただく必要があります。

私はクリーンなアプローチが存在しないことをマシューに同意します。それが継承(あるいは、少なくとも、多型)に依存しているので、Decoratorパターンは、適用されない、とあなたは(それが密閉されていますので)同じインターフェイスを持つクラスを作成することはできませんので、あなたは、可能System.Stringを飾ることはできません。

アダプタは、基本的には別のインターフェースを適応させるために使用されます。それはあなたがここで何をしたいのか、本当にありません。基本的に、何を考えているように見えることはラッパーだが、マシューが指摘するように、あなたは前後に多くを変換する必要があります。

おそらくあなたは、あなたの新しいタイプの「テキスト」という名前を付け、あなたが作成する必要がありますキャストの量を最小限にするために、文字列からの暗黙の変換を実装することができます。あなたはそのルートを選択した場合、それは自分自身を文字列として同じ動作ですので、あなたは、不変のタイプとしてあなたのタイプを設計していることを確認します。

あなたは物事をより「自然」を作るために暗黙の演算子を使用することができます:

public class SuperString
{
    public SuperString(string s) { S = s; }

    public static implicit operator SuperString(string s)
    {
        return new SuperString(s);
    }

    public string S { get; private set; }

    public bool IsNot() { return String.IsNullOrEmpty(S); }
}

[TestMethod]
public void Test_SuperString()
{
    SuperString ss = "wee";
    SuperString xx = "";
    if (xx.IsNot()) ss = "moo";
    System.Console.WriteLine(ss.S);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top