Métodos extensores

26. January 2009 23:34 by Oscar.SS in Lenguajes  //  Tags:   //   Comments (2)

Los métodos extensores o métodos de extensión, son un tipo especial de métodos estáticos que se utilizan para añadir funcionalidad a otros tipos sin utilizar la herencia o el polimorfismo.

Aunque en principio los métodos extensores más comunes son los que se utilizan con los operadores de consulta estándar de LINQ, podemos también añandir funcionalidad a tipos sellados (sealed) o a tipos propios de .NET de los cuales no conocemos el código que los implementa.

Veamos cual es la sintaxis de los métodos de extensión:

 

   public static class NombreClaseContenedora
   {
      
public static ValorDevuelto NombreMetodoExtensor(this tipo argumento, parámetros)
      {
         
//Código del método extensor.
      
}
   }

Como podemos apreciar el método extensor es estático y está implementado en una clase también estática. Es importante mendionar que ambos, la clase y el método, deben tener el mismo modificador de accesibilidad, en este caso public. No tendría sentido poder acceder desde el código cliente a la clase y no poder hacerlo al método, por ejemplo.

Veamos un ejemplo práctico. Supongamos que tenemos que multiplicar una cantidad introducida por un usuario desde un TextBox y retornar el resultado a otro campo de texto. Es evidente que esto no tiene ninguna dificultad y que podríamos hacerlo con una función de las de siempre pero...veamos el ejemplo y luego entramos en los detalles.

 

   public static class ClaseExtensora
   {
      
public static string MultiplicarXDos(this string arg)
      {
         
int valor Convert.ToInt32(arg);
         
valor *2;
         return 
valor.ToString();
      
}
   }

El primer parámetro de MultiplicarXDos() especifica en qué tipo actúa el método y va precedido del modificador this. En este caso el método actua sobre los tipos System.String de .NET. Esto quiere decir que a partir de este momento, cualquier variable de tipo cadena que definamos en nuestro código tendrá añadido un método MultiplicarXDos().






A pesar de ser un método estático, la llamada al mismo se efectúa como si se tratase de un método de instancia en el tipo extendido. Para poder llamar al método, es necesario que el espacio de nombres en el que esta definida la clase contenedora del método extensor, esté explicitamente importada utilizando una directiva using. Es decir, que para utilizar este método extensor desde otro proyecto deberemos declarar un using EspacioDeNombres.

Como ya se ha comentado, el primer parámetro del método solo indica el tipo al que se le agrega el método. Si queremos podemos añadir tantos parámetros "normales" como queramos. A condición de que el primer parámetro siempre sea el que hace referencia al tipo extendido.

      public static string MultiplicarXDos(this string arg, int multiplicador)
      {
         
int valor Convert.ToInt32(arg);
         
valor *multiplicador;
         return 
valor.ToString();
      
}

A continuación os comento alguanas cosas que hay que tener en cuenta de los métodos de extensión:

  • Puede utilizar métodos de extensión para extender una clase, interfaz, enumerado, estructura, etc.
  • Los métodos de extensión no pueden tener acceso a las variables privadas del tipo que extienden.
  • En tiempo de compilación, los métodos de extensión siempre tienen menos prioridad que los métodos de instancia definidos en el propio tipo. Es decir, que nunca se llamará a un método de extensión que tenga el mismo nombre y firma que un método de la clase que extiende.
  • Y comentar una última cosa, la clase contenedora de los métodos extensores debe ser una clase de nivel superior. Es decir, no puede ser una clase anidada dentro de otra clase.

Ejercicio de JavaScript: Acceder a los script de otras ventanas.

10. January 2009 13:18 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (1)

El enunciado de este sencillo ejercicio podría ser el siguiente:

Desde una ventana padre abrir una ventana hijo y mostrar en esta el contenido de una cadena definida en el script de la ventana padre. Pasado un retardo de 3 segundos, desde la ventana padre cambiar el contenido de una cadena definida en la ventana hijo y mostrar el contenido en esta ventana.

Creerme que es mucho más fácil de lo que parece por el enunciado. Lo que sucede, muy amenudo, es que es más sencillo ver el código que explicarlo con mil palabras.

Primero voy a mostrar los script con las funciones que realizan estas tareas y luego pasaremos a la explicaciones.

Este es el script que hay que colocar en la ventana primaria o padre:


<script type="text/javascript">

var strPadre "Esta cadena esta definida en la ventana padre.";

var 
nuevaVentana;

function 
abrirVentana()
{
    nuevaVentana 
= window.open("subVentana.html","nuevaVentana","status,height=200,width=300");
    
setTimeout("cambiarVariable()",3000);
}    

function cambiarVariable()
{
    nuevaVentana.strHijo 
"He cambiado la variable de la ventana hijo desde la ventana padre con un ratardo.";
    
nuevaVentana.document.write(nuevaVentana.strHijo);
}

abrirVentana()
;

</script>

Y este es el script de la ventana secundaria:


<script type="text/javascript">

var strHijo;

function 
mostrarCadena()
{
    strHijo 
opener.strPadre;
    window
.document.write(strHijo);
}

mostrarCadena()
;

</script>


Fijemos nuestra atención sobre la función "abrirVentana()". Aquí abrimos la ventana hijo guardando una referencia de la misma en la variable de ámbito global "nuevaVentana". A continuación llamamos con un retraso de 3 segundos a la función "cambiarVariable()".

En la función "cambiarVariable()" nos aprovechamos de que la variable "nuevaVentana" guarda una referencia a la ventana hijo para cambiar el contenido de la variable strHijo que está definida en la ventana hijo.

En el script de la ventana hijo tenemos la función "mostarCadena()", por medio de la propiedad "opener", que contiene una referencia a la ventana que ejecuta la función "window.open()", podemos acceder al contenido de la variable strPadre y mostrarla por pantalla.

Recent Comments

Comment RSS

Month List