web-dev-qa-db-ja.com

文字列クラスを継承するにはどうすればよいですか?

継承してC#文字列クラスを拡張し、WordCount()などのメソッドを追加しますが、このエラーが発生し続けます。

エラー1 'WindowsFormsApplication2.myString':封印された型 'string'から派生できません

これを乗り越える方法は他にありますか? stringStringを試してみましたが、うまくいきませんでした。

21
Nasreddine

System.Stringはシールされているため、できません。

拡張メソッド を作成できます。例えば、

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

使用する:

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

別のオプションは、暗黙の演算子を使用することです。

例:

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) { }
}
73
René

文字列クラスから継承する意図が単に 文字列クラスのエイリアスを作成する である場合、コードはより自己記述的であり、文字列から継承することはできません。代わりに、次のようなものを使用します。

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;

このエイリアスの方法で自己記述コードをエイリアス化すると、辞書やハッシュセットなどにも適用できます。

もちろん、文字列クラスに機能を追加するつもりなら、拡張メソッドを使用するのが最善です。

11
Contango

文字列から派生することはできませんが、次のような拡張子を追加できます。

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

ヘルパークラスの何が問題になっていますか?エラーメッセージが示すように、Stringは sealed であるため、現在のアプローチは機能しません。拡張メソッドはあなたの友達です:

myString.WordCount();


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

シールされたクラスを継承することはできません(それが全体のポイントです)。これが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の動作方法でもあります。

1
Nasreddine