Método de extensión

Un  método de extensión en programación es un método agregado a una clase existente ( tipo ) en un lugar que no sea el módulo de declaración de clase. El azúcar sintáctico para un módulo de extensión se introdujo en C# 3.0 y VB.NET .

El método de extensión no debe confundirse con el concepto de extensión de método relacionado con la herencia ( eng.  method extension ) que existe en los lenguajes CLOS , Smalltalk , Beta, en los que se llama al método de superclase antes, durante o después de que se active el método de clase. llamado [1] .

Implementación en C#

El siguiente ejemplo muestra un método de extensión definido para la clase System.String (con alias de cadena en C#). Tenga en cuenta que se define dentro de una clase estática no anidada y no configurable [2] :

namespace ExtensionMethods { public static class MyExtensions { // El método WordCount toma una cadena como entrada, devuelve el número de palabras, es decir el número de subcadenas separadas por un espacio, un punto o un signo de interrogación. public static int WordCount ( esta cadena str ) { return str . Dividir ( nuevo carácter [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). Longitud ; } } } /* El método de extensión WordCount aparecerá en el alcance si incluye el espacio de nombres adecuado: */ using ExtensionMethods ; /* Ahora se puede llamar: */ string s = "Hello Extension Methods" ; int yo = s . CuentaPalabras (); // i se establecerá en 3 int j = "Come un poco más de esos suaves bollos franceses y toma un poco de té". . CuentaPalabras (); // j se establecerá en 10

En comparación con un método normal, un método de extensión es estático y el primer parámetro contiene después thisde la clase de destino y la variable de clase de destino, seguido de los parámetros del método [3] .

En C#, un método de extensión solo tiene acceso a los miembros públicos de una clase. Otra limitación es que si hay un método integrado y una extensión, el método integrado tiene prioridad [3] .

Los métodos de extensión se utilizan ampliamente en LINQ . Por ejemplo, la instrucción Select es un método de extensión de la interfaz IEnumerable [4] .

Implementación en Visual Basic .NET

En Visual Basic .NET , los métodos de extensión permiten a los desarrolladores agregar nuevas funciones a los tipos de datos sin derivar tipos . Un método de extensión solo puede ser un procedimiento del formulario Subo Function, no una propiedad, campo o evento. El primer argumento del método especifica el tipo de datos de destino para la extensión. Los métodos de extensión solo se pueden definir dentro de los módulos. Como en C#, un método de instancia tiene prioridad sobre un método de extensión, incluso si este último tiene una firma más precisa [5] .

Implementación en Ruby

El lenguaje Ruby tiene una característica similar a C# 3.0 llamada "clase abierta" ( ing.  clase abierta ) [6] .

clase TestClass def método1 fin def método2 final final prueba = Clase de Prueba . nueva prueba _ prueba del método 1 . método2 clase TestClass def método3 final final prueba _ método3

Además, se puede agregar un método de extensión no a toda la clase, sino solo a una instancia específica. Además, en JRuby puedes agregar un método a una clase desde Java [6] . En Ruby, si hay un método incorporado y una extensión, el método extendido tiene prioridad.

Implementación en otros idiomas

En los lenguajes dinámicos comunes ( JavaScript , Perl , Python , Ruby ), el mecanismo del método de extensión puede implementarse desde hace mucho tiempo (con todas las precauciones) mediante " monkey patching " [7] .

Todavía no hay métodos de extensión en el estándar C++23 , pero hay un lugar para ellos: this-parameters [8] .

Notas

  1. Gardner, 2002 , pág. 63.
  2. Métodos de extensión (Guía de programación de C#) . Consultado el 15 de febrero de 2012. Archivado desde el original el 17 de febrero de 2012.
  3. 1 2 Libertad, Xie, 2007 .
  4. Métodos de extensión de C# . Fecha de acceso: 20 de septiembre de 2014. Archivado desde el original el 24 de septiembre de 2014.
  5. Bai, 2012 .
  6. 1 2 Neal Ford, ¿Son malas las clases abiertas? Archivado el 4 de marzo de 2016 en Wayback Machine , 2007
  7. Monkeypatching For Humans Archivado el 6 de septiembre de 2014 en Wayback Machine , Jeff Atwood, 2008
  8. Deduciendo esto

Literatura

  • Liberty, J. y Xie, D. Programación C# 3.0. - O'Reilly Media, 2007. - Pág. 294-297. — 608 pág. — ISBN 9780596554880 .
  • Papa, J. Servicios basados ​​en datos con Silverlight 2. - O'Reilly Media, 2008. - P. 12-14. — 368 págs. — ISBN 9780596554422 .
  • Gardner, TA Relaciones de herencia para la construcción disciplinada de software. - Springer, 2002. - ISBN 9781852334673 .
  • Bai, Y. Programación práctica de bases de datos con Visual Basic.NET. - Wiley, 2012. - Pág. 229-232. — 900p. — ISBN 9781118249826 .

Enlaces