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