C Sharp (C#) – Usar Delegados – Parte 5

Usar delegados para facilitar el uso de eventos

En este artículo veremos como usar delegados para facilitar el uso de eventos, es un ejemplo de código. Es la tarea del artículo anterior (C Sharp (C#) – Usar Delegados – Parte 4). Como sugerencia trata de hacer el ejercicio anterior y luego ve este ejemplo de código. Trata de cumplir los objetivos que di en el artículo anterior. En este artículo mostraré el resultado del ejercicio, a lo que mas o menos tenías que llegar. Obviamente no todo escriben código igual, por eso se sugiere que se haga el ejercicio anterior.

Usar delegados para facilitar el uso de eventos.

Choque de coches

Acá va el ejemplo:


// Ejemplo copiado del libro "Pro C Sharp 2010 and the dotNet 4 Platform 5th
// Edition - Andrew Troelsen - Apress" página 405 del libro. Traducido, comentado,
// editado por Writkas
//
// Car--Ejemplo.cs : 	Ejemplo que muestra como usar delegados para facilitar el
//	uso de eventos. Este ejemplo no muestra como usar eventos, lo que trata de
//	mostrar, es un ejemplo en el que podría ser útil el uso de delegados, un
//	ejemplo más o menos real.
//	En resumen el ejemplo trata sobre un auto que va subiendo la velocidad y a
//	traves de notificaciones 'personalizadas' nos avisa del peligro, y estado del
//	auto. Al chocar el auto, suponemos que alguien ejecuta la caja negra del auto
//	y se dencadenan los mensajes (métodos) registrados.
//
// Compilar :			gmcs Car--Ejemplo.cs

using System;

public class Program
{
	public static void Main ()
	{
		Console.WriteLine ("***** Delegados para facilitar eventos *****\n");

	// Crear un objeto de la clase "Car".
		Car c1 = new Car (100, 10);

	// Hay que decirle al objeto "c1" cual es el método a llamar (OnCarEngineEvent)
	// cuando se nos envíe un mensaje o notificación. Debe cumplir con la firma.
		c1.RegisterWithCarEngine (new Car.CarEngineHandler (OnCarEngineEvent));

	// Subir velocidad (este es el punto de partida para luego recibir eventos o
	// mensajes). (el bucle for no tiene llaves por que tiene una sola linea de
	// código y se puede hacer eso)
		Console.WriteLine ("***** subir velocidad *****");
		for (int i = 0; i < 6; i++)
			c1.Accelerate (20);

		Console.ReadLine ();
	}

	// Este es nuestro método personalizado que le enviaremos a el objeto delegado.
	public static void OnCarEngineEvent (string msg)
	{
		Console.WriteLine ("\n****** mensaje desde el objeto c1 *****");
		Console.WriteLine ("=> {0}", msg);
		Console.WriteLine ("************************************\n");
	}
}

public class Car
{
	// 1) Definir un tipo delegado.
	public delegate void CarEngineHandler (string msgForCaller);
	// 2) Definir un objeto delegado miembro de esta clase.
	private CarEngineHandler listOfHandlers;
	// 3) Añadir una función registro para el llamador.
	// Se le envía un objeto delegado (el creado con new, anteriormente) y se copia
	// ese objeto delegado al del objeto delegado de esta clase.
	public void RegisterWithCarEngine (CarEngineHandler methodToCall)
		{ listOfHandlers = methodToCall;}

	// Estados de las variables internas
	public int CurrentSpeed {get; set;} // Velocidad común
	public int MaxSpeed {get; set;} // Velocidad máxima

	// El auto esta vivo?
	private bool carIsDead;

	// Constructores de la clasepe
	public Car () {MaxSpeed = 100; }
	public Car (int maxSp, int currSp)
	{
		CurrentSpeed = currSp;
		MaxSpeed = maxSp;
	}

	public void Accelerate (int delta)
	{
	// ¿Si, este auto esta muerto?, enviar el mensaje de que está muerto.
		if (carIsDead)
		{
	// ¿Si, el objeto delegado 'listOfHandlers' no tiene métodos y es null?
			if (listOfHandlers != null)
				listOfHandlers ("este auto esta muerto...");
		}

		else
		{
			CurrentSpeed += delta;

	// ¿Si, este auto está casi muerto?
			if (10 == (MaxSpeed - CurrentSpeed) && listOfHandlers != null)
				listOfHandlers ("¡cuidado! va a chocar");
	// ¿Si, este auto va a más velocidad del limite o igual velocidad?
			if (CurrentSpeed >= MaxSpeed)
				carIsDead = true;
			else
				Console.WriteLine ("CurrentSpeed = {0}", CurrentSpeed);
		}
	}
}

Compilar el ejemplo y ejecutar para ver el resultado, en Linux u parecidos, si no usas MonoDevelop.

writkas@linux-xag2:/home/writkas/> gmcs Car--Ejemplo.cs
writkas@linux-xag2:/home/writkas/> mono Car--Ejemplo.exe
***** Delegados para facilitar eventos *****

***** subir velocidad *****
CurrentSpeed = 30
CurrentSpeed = 50
CurrentSpeed = 70

****** mensaje desde el objeto c1 *****
=> ¡cuidado! va a chocar
************************************

CurrentSpeed = 90

****** mensaje desde el objeto c1 *****
=> este auto esta muerto...
************************************

writkas@linux-xag2:/home/writkas/>

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miebros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

.

(parte 4: Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp) Artículo anterior | Artículo siguiente (parte 6: Manejar listas de métodos que referencian los objetos delegados)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s