2009-02-08 24 views
6

Cómo anular o ampliar las clases principales .net. por ejemploPosible extender la clase String en .net

public class String 
{ 
    public boolean contains(string str,boolean IgnoreCase){...} 
    public string replace(string str,string str2,boolean IgnoreCase){...} 
} 

después

string aa="this is a Sample"; 
if(aa.contains("sample",false)) 
{...} 

es posible?

Respuesta

22

La clase String está sellada por lo que no puede heredar de ella. Los métodos de extensión son su mejor opción. Tienen el mismo feel como métodos de instancia sin el costo de la herencia.

public static class Extensions { 
    public static bool contains(this string source, bool ignoreCase) {... } 
} 

void Example { 
    string str = "aoeeuAOEU"; 
    if (str.contains("a", true)) { ... } 
} 

Deberá utilizar VS 2008 para utilizar los métodos de extensión.

+0

@JaredPar: Una corrección, no necesita VS 2008 para usar métodos de extensión. Necesita el compilador de C# para C# 3.0 que está en .NET 3.5. VS 2008 es solo el IDE y no lo que proporciona la funcionalidad. – casperOne

+2

@casperOne, correcto. Normalmente digo VS 2008 porque es más conocido. Lo que es aún más divertido, es que puede compilar aplicaciones 2.0 con métodos de extensión si proporciona su propio atributo de Extensión. http://blogs.msdn.com/jaredpar/archive/2007/11/16/extension-methods-without-3-5-framework.aspx – JaredPar

+3

@casperOne - para devolvérselo, "o mono 2.0"; -p –

2

La clase String está sellada, por lo que no puede extenderla. Si desea agregar funciones, puede usar métodos de extensión o ajustarlos en una clase propia y proporcionar las funciones adicionales que necesite.

0

También puede usar un patrón de adaptador para agregar funcionalidad adicional. Puede hacer una sobrecarga del operador para que se sienta como la cadena integrada. Por supuesto, esto no será automático para los usos existentes de "cadena", pero tampoco lo haría su solución heredando directamente de él, si fuera posible.

1

En general, debe intentar ver si hay otro método que responda a sus necesidades de manera similar. Para su ejemplo, Contains es en realidad un método de envoltura para IndexOf, devuelva true si el valor devuelto es mayor que 0, de lo contrario false. Da la casualidad que el método IndexOf tiene varias sobrecargas, una de las cuales es IndexOf(string, StringComparison): Int32, que se puede especificar para honrar o ignorar el caso.

Consulte String.IndexOf Method (String, StringComparison) (System) para obtener más información, aunque el ejemplo es un poco extraño.

Consulte StringComparison Enumeration (System) para las diferentes opciones disponibles al usar la enumeración StringComparison.

+0

fue una buena idea – ebattulga