關於委託事件的一兩個很好的例子!

weixin_34292959發表於2005-06-20

兩個例子均用現實的例子來解釋委託事件的處理過程。很好!

  第一個例子

public delegate void EatEventHandler(object sender, EatEventArgs e);
這個的定義也可以不要這樣.可以直接就定義一個引數
public delegate void EatEventHandler(string e); 但然用的時候的引數要相對應好哦

using System;

namespace nsEventSample
{
    /// <summary>
    /// 類EatEventArgs 必須繼承自類EventArgs,用來引發事件時封裝資料
    /// </summary>
    public class EatEventArgs : EventArgs
    {
        public String restrauntName;     //飯店名稱
        public decimal moneyOut;            //準備消費金額
    }

    /// <summary>
    /// 這個委託用來說明處理吃飯事件的方法的方法頭(模式)
    /// </summary>
    public delegate void EatEventHandler(object sender, EatEventArgs e);

    /// <summary>
    /// 引發吃飯事件(EateEvent)的類Master(主人),這個類必須
    /// 1.宣告一個名為EatEvent的事件: public event EatEventHandler EatEvent;
    /// 2.通過一個名為OnEatEvent的方法來引發吃飯事件,給那些處理此事件的方法傳資料;
    /// 3.說明在某種情形下引發事件呢?在餓的時候。用方法Hungrg來模擬。
    /// </summary>
    public class Master
    {
        //宣告事件
        public event EatEventHandler EatEvent;

        //引發事件的方法
        public void OnEatEvent(EatEventArgs e)
        {
            if (EatEvent != null)
            {
                EatEvent(this, e);
            }
        }

        //當主人餓的時候,他會指定吃飯地點和消費金額。
        public void Hungry(String  restrauntName, decimal moneyOut)
        {
            EatEventArgs e = new EatEventArgs();
            e.restrauntName = restrauntName;
            e.moneyOut = moneyOut;

            Console.WriteLine("主人說:");
            Console.WriteLine("我餓了,要去{0}吃飯,消費{1}元", e.restrauntName, e.moneyOut);

            //引發事件
            OnEatEvent(e);
        }
    }

    /// <summary>
    /// 類Servant(僕人)有一個方法ArrangeFood(安排食物)來處理主人的吃飯事件
    /// </summary>
    public class Servant
    {
        public void ArrangeFood(object sender, EatEventArgs e)
        {
            Console.WriteLine();
            Console.WriteLine("僕人說:");
            Console.WriteLine("我的主人, 您的命令是 : ");
            Console.WriteLine("吃飯地點 -- {0}", e.restrauntName);
            Console.WriteLine("準備消費 -- {0}元 ", e.moneyOut);
            Console.WriteLine("好的,正給您安排。。。。。。。。");
            Console.WriteLine("主人,您的食物在這兒,請慢用");
        }
    }

    /// <summary>
    /// 類God安排qinshihuang(秦始皇)的僕人是lisi(李斯),並讓李斯的ArrangeFood
    /// 方法來處理qinshihuang的吃飯事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
    /// </summary>
    public class God
    {
        public static void Main()
        {
            Master  qinshihuang = new Master();
            Servant lishi = new Servant();

            qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
            
            //秦始皇餓了,想去希爾頓大酒店,消費5000元
            qinshihuang.Hungry("希爾頓大酒店", 5000.0m);
        }
    }
}
 

第二個例子來源於:
http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191

比如說一個公司(場景),你是老闆,手下有兩個員工,小張和小李。你命令小張注意小李,在開發軟體工作的時候如果上網打遊戲,你就記錄下來,從小李工資里扣100元錢。這個實際上就是現實中的委託。

現在給出一個程式碼,C#控制檯程式,編譯執行通過
using System;

namespace CSharpConsole
{
 public class 場景
 {
  [STAThread]
  public static void Main(string[] args)
  {
   Console.WriteLine("場景開始了....");
   // 生成小王
   小王 w = new 小王();
   // 生成小賬
   小張 z = new 小張();

   // 指定監視
   z.PlayGame += new PlayGameHandler(w.扣錢);
  
   // 開始玩遊戲
   z.玩遊戲();

   Console.WriteLine("場景結束...");
   Console.ReadLine();
  }
 }


 // 負責扣錢的人
 public class 小王
 {
  public 小王()
  {
   Console.WriteLine("生成小王...");
  }

  public void 扣錢(object sender,EventArgs e)
  {
   Console.WriteLine("小王:好小子,上班時間膽敢玩遊戲...");
   Console.WriteLine("小王:看看你小子有多少錢...");
   小張 f = (小張)sender;
   Console.WriteLine("小張的錢: " + f.錢.ToString());
   Console.WriteLine("開始扣錢......");
   System.Threading.Thread.Sleep(500);
   f.錢 = f.錢 - 500;
   Console.WriteLine("扣完了....現在小張還剩下:" + f.錢.ToString());
  }
 }

 // 如果玩遊戲,則引發事件
 public class 小張
 {
  // 先定義一個事件,這個事件表示“小張”在玩遊戲。
  public event PlayGameHandler PlayGame;
  // 儲存小張錢的變數
  private int m_Money;

  public 小張()
  {
   Console.WriteLine("生成小張....");
   m_Money = 1000; // 建構函式,初始化小張的錢。
  }

  public int 錢 // 此屬性可以操作小張的錢。
  {
   get
   {
    return m_Money;
   }
   set
   {
    m_Money = value;
   }
  }

  public void 玩遊戲()
  {
   Console.WriteLine("小張開始玩遊戲了.....");
   Console.WriteLine("小張:CS好玩,哈哈哈! 我玩.....");
   System.Threading.Thread.Sleep(500);
   System.EventArgs e = new EventArgs();
   OnPlayGame(e);
  }

  protected virtual void OnPlayGame(EventArgs e)
  {
   if(PlayGame != null)
   {
    PlayGame(this,e);
   }
  }
 }

 // 定義委託處理程式
 public delegate void PlayGameHandler(object sender,System.EventArgs e);
}


還推薦大家一系列文章:
http://blog.joycode.com/percyboy/archive/2005/01/22/43438.aspx

相關文章