using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace MyDelegate { #region 委托实现事件 //定义委托处理程序 public delegate void PlayGameHandler(object sender, System.EventArgs e); //员工,可能玩游戏的人 public class 员工 { //先定义一个事件,这个事件表示“员工”在玩游戏 public event PlayGameHandler PlayGame; //员工的称呼 private string m_Name; //员工的工资 private int m_Money; //构造函数 public 员工(string name) { Console.WriteLine("生成员工 " + name + "..."); m_Name = name; m_Money = 1000; } //此属性得到员工的称呼 public string 称呼 { get { return m_Name; } } //此属性可操作员工的工资 public int 钱 { get { return m_Money; } set { m_Money = value; } } //引发事件的“玩游戏”方法。为了引发PlayGame这个事件,必须指定此方法来引发它,其中包括 OnPlayGame(e) public void 玩游戏() { Console.WriteLine(m_Name + "开始玩游戏了..."); Console.WriteLine(m_Name + ":CS好玩,哈哈哈!我玩..."); System.Threading.Thread.Sleep(500); System.EventArgs e = new EventArgs(); OnPlayGame(e); } //实现OnPlayGame(e) //protected virtual void OnPlayGame(System.EventArgs e) protected void OnPlayGame(System.EventArgs e) { if (PlayGame != null) PlayGame(this, e); } } //负责扣钱的人 public class 老板 { //构造函数 public 老板() { Console.WriteLine("生成老板..."); } public void 扣钱(object sender, EventArgs e) { Console.WriteLine("老板:好小子,上班时间胆敢玩游戏..."); Console.WriteLine("老板:看看你小子有多少钱..."); 员工 f = (员工)sender; /*这个代码表示让老板扣员工的钱,那么,老板扣钱的时候,必须要操作员工的对象实例。 参数object sender对象表示激发事件的对象,在这个程序里面就表示这个sender其实是员工*/ Console.WriteLine(f.称呼 + "的钱:" + f.钱.ToString()); Console.WriteLine("开始扣钱..."); System.Threading.Thread.Sleep(500); f.钱 = f.钱 - 500; Console.WriteLine("扣完了...现在" + f.称呼 + "还剩下:" + f.钱.ToString()); } } class Program { static void Main(string[] args) { Console.WriteLine("剧情开始了..."); 老板 boss = new 老板(); //老板 员工 employee = new 员工("小张"); //员工小张 //指定监视,即设定发现小张玩游戏后采取的行动——扣钱 employee.PlayGame += new PlayGameHandler(boss.扣钱); //小张开始玩游戏,浑然不知老板就在身后 employee.玩游戏(); //结果钱被扣掉,歇菜 Console.WriteLine("剧情结束..."); Console.ReadLine(); } } #endregion } |
|