什么是干净/直观的方法来在.NET 1.1延伸的密封类?
-
20-08-2019 - |
题
我在架构,将在产品的多个版本中使用的库的过程,其工作的一部分是增加了一些并不在.NET 1.1中存在的功能,因为我们是使用它需要的。也许这方面最好的例子就是String.IsNullOrEmpty方法,它的功能,我们依靠大量相当。
在.NET String类是密封的;我想过使用任何适配器或装饰图案通过包装原始字符串扩展类的功能,但我不认为这是什么,我试图做一个非常直观的方法。我也看了的在计算器上另一篇文章了解过类似的问题,但它再次引起我刚才提到的问题。
我肯定可以使用适配器创建我要找的功能,但我无法想象这样做,每串:
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);
}