2009-06-25 5 views
2

Ich bin dabei, eine Bibliothek zu erstellen, die in mehreren Releases eines Produkts verwendet wird, und ein Teil ihrer Aufgabe besteht darin, einige der Funktionen zu erweitern, die in .NET 1.1 nicht existieren, da wir dazu benötigt werden um es zu benutzen. Das wahrscheinlich beste Beispiel dafür ist die String.IsNullOrEmpty-Methode, auf deren Funktionalität wir uns ziemlich verlassen.Was ist ein sauberer/intuitiver Ansatz zum Erweitern einer versiegelten Klasse in .NET 1.1?

Die String-Klasse in .NET ist versiegelt; Ich habe darüber nachgedacht, entweder das Adapter- oder das Decorator-Muster zu verwenden, um die Funktionalität der Klasse durch das Umschließen der ursprünglichen Zeichenfolge zu erweitern, aber ich bin nicht überzeugt, dass dies ein sehr intuitiver Ansatz für das ist, was ich versuche. Ich habe auch über eine ähnliche Frage another post on StackOverflow betrachtet, aber es wirft erneut das Problem auf, das ich gerade erwähnte.

Ich konnte definitiv Adapter verwenden, um die Funktionalität Ich suche zu schaffen, aber ich kann tun dies für jede Saite nicht vorstellen:

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

ich nicht unbedingt diesen Ansatz nicht mögen, aber es scheint, Wie es in viel Speicherverwaltung resultiert, wo eine andere Lösung besser sein könnte. Ich bin auch nicht scharf darauf, eine "StringUtility" -Bibliothek zu erstellen, da diese Vorgehensweise mich vom objektorientierten Design, dem ich folgen möchte, entfernt.

Jede Eingabe wäre hilfreich; Wenn ich nur verrückt bin und einen dieser Ansätze verwenden sollte, lass es mich wissen. Ich suche mehr nach Best Practices als nach einer Lösung, da ich mehrere habe.

+0

Ich wollte nur die Adapter-Muster empfehlen und eine kleine Probe zu schreiben, aber ... es scheint, dass Sie bereits erwähnt :( –

+0

Ich hasse versiegelte Klassen, besonders versiegelte Klassen, die nicht serialisierbar sind.Seit 1.1 wollte ich SqlDataAdapter erweitern, um eine eingeschränkte Serialisierung zu ermöglichen, also konnte ich Details über Parameter und dergleichen in einer netten Konfigurationsdatei anstatt eines Stapels hässlichen maschinengenerierten Codes haben . – quillbreaker

Antwort

3

Ich würde die "StringUtility" -Bibliothek mit einer statischen IsNullOrEmpty-Methode persönlich bevorzugen. Im Wesentlichen würden Sie extension methods ohne die nette Syntax für das Aufrufen von ihnen erstellen.

2

Per Definition gibt es keinen sauberen Ansatz. Ich denke, der Adapter-Ansatz ist das Beste, was Sie in .NET 1.1 tun können. Natürlich müssen Sie im Umgang mit der Außenwelt hin und her gehen.

0

Ich stimme mit Matthew überein, dass es keinen sauberen Ansatz gibt. Das Decorator-Muster ist nicht anwendbar, da es auf Vererbung (oder zumindest Polymorphismus) beruht, und Sie können System.String nicht dekorieren, da Sie keine Klasse mit derselben Schnittstelle erstellen können (da sie versiegelt ist).

Adapter wird grundsätzlich verwendet, um eine Schnittstelle an eine andere anzupassen. Das ist nicht das, was du hier machen willst. Was Sie im Grunde denken, ist ein Wrapper, aber wie Matthew betont, müssen Sie sehr viel hin und her konvertieren.

Vielleicht könnten Sie Ihren neuen Typ "Text" nennen und implizite Konvertierungen in und aus string implementieren, um die Anzahl der Umwandlungen zu minimieren, die Sie schreiben müssen. Wenn Sie diese Route auswählen, stellen Sie sicher, dass Sie Ihren Typ als unveränderlichen Typ entwerfen, da dies das gleiche Verhalten wie Strings selbst ist.

0

können Sie einen impliziten Operator verwenden, um Dinge mehr „natürlich“ zu machen:

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); 
} 
Verwandte Themen