domingo, septiembre 28, 2008

DELEGADOS Y MÉTODOS ANÓNIMOS EN DELPHI

Ahora que me están impartiendo un curso de C# me toco ver los famosos Delegados, cuando mi instructor menciono esa palabra me pregunte ¿qué diablos en un delegado? ¿Existen en Delphi? Luego cuando termino la explicación me di cuenta que los famosos delegados no son más que punteros a métodos y que siempre han existido en Delphi de hecho son la base de los eventos.

Un delegado es un tipo que hace referencia a un método, en realidad es un puntero a un método y son una característica muy interesante ya que nos permiten pasar métodos como parámetros de otros métodos. Los delegados tienen las siguientes propiedades:

  • Los delegados son similares a los punteros a funciones pero con la diferencia de que un puntero a un método son un par de punteros; el primero guarda la dirección al método y el segundo guarda una referencia a un objeto.
  • Los delegados permiten pasar métodos como parámetros.
  • Los delegados pueden utilizarse para definir métodos de devolución de llamada.
  • La versión de Delphi 2009 introduce el concepto de métodos anónimos, que permite pasar bloques de código como parámetros en lugar de utilizar métodos definidos independientemente.

Como dije antes un delegado nos permite pasar un método como parámetro de otro método, sabemos cómo hacer para pasar tipos de datos como parámetros, simplemente declaramos el tipo y el nombre, si quisiera indicar que en cierto lugar espero un método para utilizarlo tengo que establecer el tipo de retorno del método en este caso si es una función o un procedimiento y los parámetros que acepta, esto es justamente un delegado, una firma que nos permite establecer cómo deberá ser el método que esperamos. Veamos la declaración de un delegado para utilizarlo en un método como parámetro:






El delegado se declara en la sección type y es parecido a la declaración de un puntero a una función pero al final agregamos las palabras of Object para indicar que es un puntero a un método.

Ahora vamos a crear un método que espere un tipo TDelegado como parámetro para invocarlo dentro.







Este método va a tomar como parámetro un delegado del tipo TDelegado (o sea un método tipo procedimiento y tome un string como parámetro) y luego lo va a invocar. Veamos la llamada al método. Primero creamos el método que utilizáremos como parámetro del tipo TDelegado.













El método recibe un string y manda el mensaje a la pantalla. Ahora vamos a ver cómo se invoca.








Ahora lo corremos y vemos que funciona:















Resumiendo:
  1. Primero declaramos un tipo delegado.
  2. Luego declaramos un método que espera un tipo delegado como parámetro.
  3. A continuación declaramos un método que es el que vamos a pasar como parámetro al método anterior.
  4. Y finalmente lo invocamos.
Hay una forma de de ahorrarnos un paso en esta secuencia, podemos evitarnos la fatiga de declarar el método que vamos a pasar como parámetro, la solución es la siguiente:

1. Vamos a cambiar la declaración del tipo delegado de la siguiente forma:

2. Luego modificamos el método que espera un al tipo delegado se la siguiente forma:






3. Y finalmente lo invocamos







Lo que hacemos aquí es definir en la misma línea el delegado y la implementación, esto es lo que se conoce como método anónimo.

Un método anónimo es un procedimiento o función que no tiene un nombre asociado. En un método anónimo un bloque de código puede tratarse como una entidad y puede asignarse a una variable o puede ser usado como parámetro, como en el ejemplo anterior.

El objetivo principal del método anónimo es reducir la cantidad de código requerida para establecer una funcionalidad con delegados, sobre todo cuando no estamos interesados en involucrar relaciones entre las clases.

Bueno pues hasta aquí mi explicación espero haya quedado claro lo que son los delegados y métodos anónimos en el próximo post tratare el tema de los Generics o Genéricos y al finalizar daré un ejemplo práctico del uso de estas nuevas características en Delphi 2009.

0 Comentarios:

Publicar un comentario

Suscribirse a Comentarios de la entrada [Atom]

<< Página Principal

eXTReMe Tracker