• Jueves 30 de Mayo de 2024, 01:41

Autor Tema:  Delegados y eventos  (Leído 722 veces)

cls71

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Delegados y eventos
« en: Jueves 29 de Enero de 2009, 11:13 »
0
Hola,
tengo un problema y no sé cómo resolverlo. Agradecería cualquier ayuda.

Tengo varios objetos Cubo. Cada cubo tiene una capacidad y se usan para recoger la lluvia. Son pluviómetros.
Con un random simulo la lluvia caída cada día. Hago un bucle de 1000 para simular 1000 días.
Necesito saber cuándo un cubo es rebosado y cuántos lo son cada día.

He implementado lo siguiente:
1.- Un clase Cubo con el campo capacidad que representa el agua que puede contener ese cubo. También declaro el evento OnCuboLleno y el método CheckCubo. Dentro del método CheckCubo se dispara el evento OnCuboLleno si la capacidad es superada por la lluvía caída.
2.- Una clase Manejador para informar cuando se dispara el evento.
3.- La clase principal para arrancar. Hay un bucle para simular 1000 días de lluvia (la lluvia toma valores entre 0-99).

Me gustaría saber si con delegados/eventos puedo automatizar todo el proceso para no tener que llamar al método CheckCubo con cada objeto dentro del bucle for. ¿Hay alguna forma de que los objetos ejecuten su método CheckCubo sin tener que llamarlo desde el for ?

(En este ejemplo sólo hay un Cubo, pero en realidad tendré un array con unos cuantos cientos y no quiero (a no ser que no quede más remedio) tener que recorrer todo el array y preguntar al método CheckCubo con cada objeto).

Muchas gracias por cualquier ayuda.

Saludos

Código: Text
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5.  
  6. namespace Eventos01
  7. {
  8.     public delegate void TipoCuboLLeno( int a, int b );
  9.  
  10.     class Cubo      
  11.     {
  12.         private int capacidad;
  13.  
  14.         public event TipoCuboLLeno OnCuboLleno;
  15.  
  16.         public Cubo( int _capacidad)
  17.         {
  18.             capacidad = _capacidad;
  19.             OnCuboLleno = null;
  20.         }
  21.  
  22.         public void CheckCubo( int _lluvia )
  23.         {
  24.             if (_lluvia >= this.capacidad)
  25.             {
  26.                 OnCuboLleno(this.capacidad, _lluvia);
  27.             }
  28.         }
  29.     }
  30.  
  31.     class Manejador
  32.     {
  33.         public void EventoLanzado(int _capacidad, int _lluvia)
  34.         {
  35.             Console.WriteLine("Cubo rebosado ... " + "Capacidad: " + _capacidad + " Lluvia : " + _lluvia);
  36.         }
  37.     }
  38.  
  39.     class Program
  40.     {
  41.         static void Main(string[] args)
  42.         {
  43.             Cubo myCubo = new Cubo(50);
  44.             Manejador hd = new Manejador();
  45.             myCubo.OnCuboLleno += new TipoCuboLLeno(hd.EventoLanzado);
  46.  
  47.             // Número aleatorio para simular la lluvia
  48.             Random r = new Random();
  49.             int lluviaSim;
  50.             for (int dia = 0; dia != 1000; dia++) // Se simula para 1000 días
  51.             {
  52.                 lluviaSim = (int)Math.Floor(100.00 * r.NextDouble());
  53.                 myCubo.CheckCubo(lluviaSim);
  54.             }
  55.         }
  56.     }
  57. }
  58.  
  59.