我怎样才能继承字符串类?

时间:2011-12-05 17:03:51

标签: c# .net string inheritance

我想继承扩展C#字符串类来添加像WordCount()这样的方法以及其他几个方法,但我不断收到此错误:

  

错误1'WindowsFormsApplication2.myString':无法从密封派生   输入'string'

还有其他方法可以解决这个问题吗?我尝试使用stringString,但它没有用。

7 个答案:

答案 0 :(得分:65)

另一种选择可能是使用隐式运算符。

示例:

class Foo {
    readonly string _value;
    public Foo(string value) {
        this._value = value;
    }
    public static implicit operator string(Foo d) {
        return d._value;
    }
    public static implicit operator Foo(string d) {
        return new Foo(d);
    }
}

Foo类就像一个字符串。

class Example {
    public void Test() {
        Foo test = "test";
        Do(test);
    }
    public void Do(string something) { }
}

答案 1 :(得分:36)

System.String是密封的,所以,不,你不能这样做。

您可以创建extension methods。例如,

public static class MyStringExtensions
{
    public static int WordCount(this string inputString) { ... }
}

使用:

string someString = "Two Words";
int numberOfWords = someString.WordCount();

答案 2 :(得分:11)

如果您继承字符串类的意图仅仅是create an alias to the string class,那么您的代码更自我描述,那么您就不能从字符串继承。相反,使用这样的东西:

using DictKey = System.String;
using DictValue= System.String;
using MetaData = System.String;
using SecurityString = System.String;

这意味着您的代码现在更具自我描述性,意图更清晰,例如:

Tuple<DictKey, DictValue, MetaData, SecurityString> moreDescriptive;

在我看来,这段代码与同一代码相比显示出更多意图,没有别名:

Tuple<string, string, string, string> lessDescriptive;

这种用于更多自描述代码的别名的方法也适用于字典,哈希集等。

当然,如果您的目的是为字符串类添加功能,那么最好的办法是使用扩展方法。

答案 3 :(得分:4)

您无法从字符串派生,但您可以添加以下扩展程序:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
    }
}

答案 4 :(得分:2)

帮助程序类有什么问题?正如您的错误消息所示,String为sealed,因此您当前的方法将无效。扩展方法是你的朋友:

myString.WordCount();


static class StringEx
{
    public static int WordCount(this string s)
    {
        //implementation.
    }
}

答案 5 :(得分:1)

你不能继承一个密封的类(这是它的全部要点)以及它不能同时适用于string和System.String的原因是关键字string只是简单的System.String的别名。

如果您不需要访问字符串类的内部,那么您可以创建一个Extension Method,在您的情况下:

//note that extension methods can only be declared in a static class
static public class StringExtension {

    static public  int WordCount(this string other){
        //count the word here
        return YOUR_WORD_COUNT;
    }

}

你仍然无法访问字符串类的私有方法和属性,但IMO比写作更好:

StringHelper.WordCount(yourString);

这也是LINQ的工作原理。

答案 6 :(得分:-9)

您是否发现sealed关键字不只是为了好玩?字符串类标记为sealed ,因为您不应该继承它

所以不,你不能“绕过它”。

可以做的是在其他地方实现这些功能。要么作为其他类的纯静态方法,要么作为扩展方法,允许它们看起来像字符串成员。

但是当一个类被标记为密封时,你无法“绕过”它。