我想继承扩展C#字符串类来添加像WordCount()
这样的方法以及其他几个方法,但我不断收到此错误:
错误1'WindowsFormsApplication2.myString':无法从密封派生 输入'string'
还有其他方法可以解决这个问题吗?我尝试使用string
和String
,但它没有用。
答案 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
,因为您不应该继承它。
所以不,你不能“绕过它”。
可以做的是在其他地方实现这些功能。要么作为其他类的纯静态方法,要么作为扩展方法,允许它们看起来像字符串成员。
但是当一个类被标记为密封时,你无法“绕过”它。