Está en la página 1de 3

C# Delegado

Veamos un ejemplo prctico y sencillo del uso de eventos delegados, de forma que nos quede claro su concepto y su uso.
Que es un Delegado?

Un delegado (delegate) es un tipo especial de clase cuyos objetos pueden almacenar referencias (punteros, apuntadores) a uno o ms mtodos, posibilitndonos (desde el objeto) lanzar la ejecucin en cadena de todos estosmtodos. Hasta aqu la definicin mas sencilla posible, pero igualmente algo complicada de entender, expliqumosla a travs de 2 ejemplos abstractos con la esperanza de que se comprenda algo mejor:

Delegado Ejemplo Simple


Por ejemplo, si queremos "interceptar el evento Click de un botn llamado btnPrueba1 y asociarlo a un determinado mtodo que ya tuviramos definido (MetodoPruebaDelegado), tendremos que: Definir el mtodo (MetodoPruebaDelegado) de forma que tenga la misma firma que el delegado asociado a ese evento. protected void MetodoPruebaDelegado(object sender, EventArgs e) { //Aqu escribiramos el cdigo que quisiramos ejecutar en dicho evento } Lo prximo sera asociar el mtodo creado (MetodoPruebaDelegado) con el evento Click del botn. Para lograrlo podremos usar cualquiera de las dos formas que veremos a continuacin, usando la forma tradicional o la que se incluy en la versin 2.0 del lenguaje (covarianza): // Asignacin del mtodo del evento usando el constructor del delegado this.btnPrueba1.Click += new System.EventHandler(this.MetodoPruebaDelegado);
// Asignacin del mtodo usando la covarianza this.btnPrueba1.Click += this.MetodoPruebaDelegado;

Nota: Hasta aqu hemos visto como asociar un mtodo (MetodoPruebaDelegado) al evento (Click) de un control(btnPrueba1), no hemos hablado nada de los DELEGADOS; pero en C# eventos y delegados estn muy ligados como veremos a continuacin. De hecho no se puede definir un evento si no definimos previamente un delegado.

Delegado Ejemplo Prctico


Si tuviramos una pgina Page1 y un control de usuario uc1, y quisiramos desde un mtodo de uc1 llamar a un mtodo de Page1, tendramos que declarar un delegado en uc1 y desde Page1 almacenar en el delegado el mtodo de la pgina (uc1.Delegado1 = Page1.Mtodo). Creo que igual me enrede, en fin veamos un caso prctico y concreto que recientemente tuve, donde us un delegado (delegate). Imaginemos la siguiente problemtica: Tengo que implementar una bsqueda de vuelos areos ( ver imagen):

Para ello crearemos una pgina que contendr, entre otras cosas, 2 controles y un mtodo: ucBuscadorCriterios (marcada en rojo): Contiene las condiciones de filtros a establecer para la bsqueda del vuelo. ucBuscadorResultado (marcada en azul): Contendr los resultados de los vuelos que cumplen las condiciones establecidas. BuscarVuelos(): Mtodo que se encargar de buscar y devolver todos los vuelos que cumplen con unas ciertos criterios de bsqueda. Los criterios son definidos en ucBuscadorCriterios y los resultados los usaremos para mostrarlos en ucBuscadorResultado. Hasta aqu todo bien, pero si nos fijamos en ucBuscadorCriterios (rojo) dentro tiene el botn btnBuscarVuelos, el cual debe lanzar la bsqueda, o sea, debe llamar al mtodo BuscarVuelos() que est en la pgina. Nuestro problema sera: Como llamar a Page1.BuscarVuelos() desde Page1.ucBuscadorCriterios? La respuesta es sencilla, usaremos un delegado (delegate).

Usando Delegado (Delegate)


1. Lo primero que haremos es declarar el delegado (MyDelegadoBuscarEventHandler), este delegado contiene o define la firma del evento, en nuestro ejemplo debemos abrir el cdigo del control de usuario (ucBuscadorCriterios) y definir nuestro delegado. 2. Despus definimos el evento (AereoBuscadorBuscarClick) que ser del tipo delegado(MyDelegadoBuscarEventHandler), hasta aqu si retiramos las palabras public event podramos leer como que hemos declarado una variable especial del tipo del delegado. 3. Posteriormente en el evento asociado al clic del botn Buscar Vuelos (AereoBuscadorBuscar_Click) haremos la llamada al evento (AereoBuscadorBuscarClick). Aqu debemos tener en cuenta que antes de hacer la llamada alevento debemos chequear que dicho evento tiene a alguien suscrito (AereoBuscadorBuscarClick != null). 4. Ya lo tenemos casi todo hecho solo nos falta asociar (suscribir) el mtodo que nos interesaPage1.BuscarVuelos() al evento (AereoBuscadorBuscarClick).

public partial class UserControlsAereoBuscadorCriterios : UserControl { //Declarar el delegado //(puntero a la funcin que se encuentra en la pagina) public delegate void MyDelegadoBuscarEventHandler(); public event MyDelegadoBuscarEventHandler AereoBuscadorBuscarClick; protected void Page_Load(object sender, EventArgs e) {} //Evento asociado al botn AereoBuscadorBuscar y que es un delegado o puntero a la funcin que se encuentra en la pagina protected void AereoBuscadorBuscar_Click(object sender, EventArgs e) { if (AereoBuscadorBuscarClick == null) return;

AereoBuscadorBuscarClick();
} } Para asociar el evento que hemos creado (AereoBuscadorBuscarClick) al mtodo de la pgina (Page1.BuscarVuelos()) tenemos que ir al cdigo de la pgina y en el evento Page_load hacer la asociacin correspondiente: protected void Page_Load(object sender, EventArgs e) { //Asociar el delegado del control de usuario ucBuscadorCriterios.AereoBuscadorBuscarClick += BuscarVuelos; } internal void BuscarVuelos() {} Y todo listo, ya tenemos un ejemplo prctico de un delegado (delegate) Despus de escribir el artculo no se si ha quedado clara la idea de uso de un delegado. Por eso resumir algunos puntos por si queda alguna duda: Resumen: Siempre que queramos hacer uso de los eventos y delegados en C# deberemos: 1. Declarar el delegado. Para el mejor entendimiento debemos tener en cuenta que el delegado no es otra cosa que una clase (tipo de dato) especial. 2. Declarar el evento de tipo del delegado. Si tenemos en cuenta que el delegado es una clase, pues el eventoes algo como una propiedad especial del tipo delegado. 3. Implementar el mtodo X a suscribir. Este mtodo deber tener la misma firma que el delegado. 4. Por ultimo, para asociar o enlazar un mtodo X al evento, accedemos a la propiedad del objeto y le adicionamos el mtodo. Teniendo en cuenta que el mtodo X tiene que cumplir con la firma del delegado.

También podría gustarte