什么是在.NET 1.1中扩展密封类的干净/直观的方法?
我正在构建一个将用于多个产品版本的库,其部分工作是增强.NET 1.1中不存在的一些功能,因为我们需要使用它。可能的最好的例子就是String.IsNullOrEmpty方法,它的功能我们相当依赖。什么是在.NET 1.1中扩展密封类的干净/直观的方法?
.NET中的String类是密封的;我想过使用Adapter或Decorator模式来通过包装原始字符串来扩展类的功能,但我不相信这是一个非常直观的方法,我正在尝试做什么。我也看过another post on StackOverflow关于类似的问题,但它再次提出我刚刚提到的问题。
我肯定可以使用适配器创建我要找的功能,但我无法想象这样做,每串:
bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty();
if (isEmpty)
{
// Do something
}
我并不喜欢这种做法,但似乎就像它导致大量的内存管理,其中不同的解决方案可能会更好。另外,我对创建一个“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);
}
我只是想建议Adapter模式,写一个小样本,但...看来你已经提到它:( – 2009-06-25 21:45:16