net inherits herencia example asp c# .net string inheritance

inherits - interface c#



¿Cómo puedo heredar la clase de cadena? (7)

Quiero heredar para extender la clase de cadena C # para agregar métodos como WordCount() y muchos otros, pero sigo recibiendo este error:

Error 1 ''WindowsFormsApplication2.myString'': no ​​se puede derivar del tipo ''cadena'' sellado

¿Hay alguna otra manera en que pueda superar esto? Lo intenté con string y String pero no funcionó.


¿Qué pasa con una clase de ayuda? Como su mensaje de error le indica, la cadena está sealed , por lo que su enfoque actual no funcionará. Los métodos de extensión son tus amigos:

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


¿Se te ha ocurrido que la palabra clave sealed no es solo por diversión? La clase de cadena está marcada como sealed porque se supone que no debe heredarla .

Así que no, no puedes "evitarlo".

Lo que puedes hacer es implementar esas funciones en otros lugares. Ya sea como métodos estáticos simples en alguna otra clase, o como métodos de extensión , permitiéndoles parecer miembros de cadena.

Pero no puedes "evitarlo" cuando una clase está marcada como sellada.


No puede derivar de una cadena, pero puede agregar extensiones como:

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


No puede heredar una clase sellada (ese es el punto central de la misma) y la razón por la que no funcionaría tanto con la string como con System.String es que la string palabras clave es simplemente un alias para System.String .

Si no necesita acceder a las partes internas de la clase de cadena, lo que puede hacer es crear un Extension Method , en su 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; } }

Aún no tendrá acceso a los métodos y propiedades privados de la clase de cadena, pero en IMO es mejor que escribir:

StringHelper.WordCount(yourString);

Así es también como funciona LINQ.


Otra opción podría ser utilizar un operador implícito.

Ejemplo:

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

La clase Foo actúa como una cuerda.

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


Si su intención detrás de heredar de la clase de cadena es simplemente crear un alias para la clase de cadena , por lo que su código se describe más a sí mismo, entonces no puede heredar de la cadena. En su lugar, use algo como esto:

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

Esto significa que su código ahora es más autodescriptivo y la intención es más clara, por ejemplo:

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

En mi opinión, este código muestra más intención en comparación con el mismo código, sin alias:

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

Este método de creación de alias para más códigos de autodescripción también es aplicable a diccionarios, conjuntos de hash, etc.

Por supuesto, si su intención es agregar funcionalidad a la clase de cadena, entonces su mejor apuesta es usar métodos de extensión.


System.String está sellado, entonces, no, no puedes hacer eso.

Puede crear métodos de extensión . Por ejemplo,

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

utilizar:

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