Подтвердить что ты не робот

Как я могу наследовать класс строк?

Я хочу наследовать, чтобы расширить класс строк С#, чтобы добавить такие методы, как WordCount() и несколько других, но я продолжаю получать эту ошибку:

Ошибка 1 'WindowsFormsApplication2.myString': не может быть получен из запечатанного type 'string'

Есть ли другой способ преодолеть это? Я пробовал с string и string, но это не сработало.

4b9b3361

Ответ 1

System.String запечатан, поэтому нет, вы не можете этого сделать.

Вы можете создать методы расширения. Например,

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

использование:

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

Ответ 2

Другим вариантом может быть использование неявного оператора.

Пример:

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) { }
}

Ответ 3

Если ваше намерение унаследовать от строкового класса - просто создать псевдоним для класса строк, значит, ваш код более самоописателен, тогда вы не можете наследовать от строки. Вместо этого используйте что-то вроде этого:

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;

Этот метод псевдонимов для более самостоятельного описания кода также применим к словарям, хеш-наборам и т.д.

Конечно, если вы хотите добавить функциональность в класс строк, то лучше всего использовать методы расширения.

Ответ 4

Вы не можете получить строку, но вы можете добавить расширения, например:

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

Ответ 5

Что случилось со вспомогательным классом? Как сообщает ваше сообщение об ошибке, String запечатан, поэтому ваш текущий подход не будет работать. Методы расширения - ваш друг:

myString.WordCount();


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

Ответ 6

Вы не можете наследовать запечатанный класс (что все его значение) и причина, по которой он не будет работать с string и System.String, заключается в том, что ключевое слово string является просто псевдонимом для System.String.

Если вам не нужно обращаться к внутренним элементам строкового класса, то вы можете создать Extension Method в своем case:

//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.

Ответ 7

Строковый класс помечен как sealed потому что вы не должны наследовать от него.

Так что нет, вы не можете "обойти это".

Что вы можете сделать, это реализовать эти функции в другом месте. Либо как простые статические методы в каком-либо другом классе, либо как методы расширения, позволяющие им выглядеть как строковые члены.

Но вы не можете обойти это, когда класс помечен как запечатанный.