ti-enxame.com

Como posso herdar a classe string?

Eu quero herdar para estender a classe de string C # para adicionar métodos como WordCount() e vários outros, mas continuo recebendo este erro:

Erro 1 'WindowsFormsApplication2.myString': não é possível derivar do tipo selado 'string'

Existe alguma outra maneira de superar isso? Eu tentei com string e String, mas não funcionou.

21
Nasreddine

System.String é selado, então, não, você não pode fazer isso.

Você pode criar métodos de extensão . Por exemplo,

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

usar:

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

Outra opção poderia ser usar um operador implícito.

Exemplo:

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

A classe Foo atua como uma string.

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

Se sua intenção por trás da herança da classe string é simplesmente criar um alias para a classe string , para que seu código seja mais auto-descritivo, não será possível herdar da string. Em vez disso, use algo como isto:

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

Isso significa que seu código agora é mais auto-descritivo e a intenção é mais clara, por exemplo:

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

Na minha opinião, este código mostra mais intenção em comparação com o mesmo código, sem aliases:

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

Este método de aliasing para mais códigos autoexplicativos também é aplicável a dicionários, conjuntos de hash, etc.

Obviamente, se sua intenção é adicionar funcionalidade à classe de string, sua melhor aposta é usar métodos de extensão.

11
Contango

Você não pode derivar de string, mas pode adicionar extensões como:

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

O que há de errado com uma classe auxiliar? Como sua mensagem de erro informa, String é selado , portanto, sua abordagem atual não funcionará. Os métodos de extensão são seus amigos:

myString.WordCount();


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

Você não pode herdar uma classe selada (esse é o objetivo) e a razão pela qual ela não funcionaria com string e System.String é que a palavra-chave string é simplesmente um alias para System.String.

Se você não precisar acessar os elementos internos da classe string, o que você pode fazer é criar um Extension Method , no seu caso:

//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;
    }

}

Você ainda não terá acesso aos métodos e propriedades particulares da classe string, mas o IMO é melhor do que escrever:

StringHelper.WordCount(yourString);

É também assim que o LINQ funciona.

1
Nasreddine