継承してC#文字列クラスを拡張し、WordCount()
などのメソッドを追加しますが、このエラーが発生し続けます。
エラー1 'WindowsFormsApplication2.myString':封印された型 'string'から派生できません
これを乗り越える方法は他にありますか? string
とString
を試してみましたが、うまくいきませんでした。
System.Stringはシールされているため、できません。
拡張メソッド を作成できます。例えば、
public static class MyStringExtensions
{
public static int WordCount(this string inputString) { ... }
}
使用する:
string someString = "Two Words";
int numberOfWords = someString.WordCount();
別のオプションは、暗黙の演算子を使用することです。
例:
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) { }
}
文字列クラスから継承する意図が単に 文字列クラスのエイリアスを作成する である場合、コードはより自己記述的であり、文字列から継承することはできません。代わりに、次のようなものを使用します。
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;
このエイリアスの方法で自己記述コードをエイリアス化すると、辞書やハッシュセットなどにも適用できます。
もちろん、文字列クラスに機能を追加するつもりなら、拡張メソッドを使用するのが最善です。
文字列から派生することはできませんが、次のような拡張子を追加できます。
public static class StringExtensions
{
public static int WordCount(this string str)
{
}
}
ヘルパークラスの何が問題になっていますか?エラーメッセージが示すように、Stringは sealed であるため、現在のアプローチは機能しません。拡張メソッドはあなたの友達です:
myString.WordCount();
static class StringEx
{
public static int WordCount(this string s)
{
//implementation.
}
}
シールされたクラスを継承することはできません(それが全体のポイントです)。これが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の動作方法でもあります。