委托、事件、事件访问器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托与事件
{
    public class MaiPiaoEventArgs : EventArgs                   //自定义事件数据类
    {
        public string diFang;
        public double money;
        //构造函数
        public MaiPiaoEventArgs(string diFang, int money)
        {
            this.diFang = diFang;
            this.money = money;
        }
    }
   
    public class Publisher //发行者
    {
        public delegate void MaiPiaoEventHandler(object sender, MaiPiaoEventArgs e); //事件委托
        private int money;                 //私有字段
        public Publisher(int x)           //构造函数
        {
            this.money = x;
        }

        public event MaiPiaoEventHandler MaiPiaoEvent1;  //类似字段的公共事件。MaiPiaoEvent1、maiPiaoEvent2就是一个委托类型的变量。

        private event MaiPiaoEventHandler maiPiaoEvent2;  //类似字段的私有事件。类似属性的私有字段,在这里是私有事件。
        public event MaiPiaoEventHandler MaiPiaoEvent2   //类似属性的公共事件,包含访问器(事件访问器)。好比属性访问器。
        {
            add                                          //事件添加访问器
            {
                lock (this)                             //锁定事件的包含对象。this用于实例事件;对于静态事件,用typeof(类名)替换this
                {
                    if (money > 20)
                    {
                        maiPiaoEvent2 += new MaiPiaoEventHandler(value);
                        Console.WriteLine("MaiPiaoEvent2说:“钱足够,可以买车票了”。\n");
                    }
                    else
                    {
                        Console.WriteLine("MaiPiaoEvent2说:“钱不够,车票买不成了”。\n");
                    }
                }
            }
            remove                                      //事件移除访问器
            {
                lock (this)
                {
                    maiPiaoEvent2 -= new MaiPiaoEventHandler(value);
                    Console.WriteLine("MaiPiaoEvent2说:“已从待办事项中取消买车票的计划”。\n");
                }
            }
        }
        protected virtual void OnMaiPiaoEvent1(MaiPiaoEventArgs e)
        {
            if (MaiPiaoEvent1 != null)
            {
                MaiPiaoEvent1(this, e);
            }
        }
        protected virtual void OnMaiPiaoEvent2(MaiPiaoEventArgs e)
        {
            if (maiPiaoEvent2 != null)
            {
                maiPiaoEvent2(this, e);
            }
        }
        public void Start(string diFang, int money)
        {
            MaiPiaoEventArgs MaiPiao = new MaiPiaoEventArgs(diFang, money);
            this.OnMaiPiaoEvent2(MaiPiao);
            this.OnMaiPiaoEvent1(MaiPiao);
        }

    }
    class Program
    {
        static void MrMing(object sender, MaiPiaoEventArgs e)
        {
            if (e.money < 20)
            {
                Console.WriteLine("Mr.Ming说:“20块都不到,能买{0}的车票?你自己去,我买不到!”\n", e.diFang);
            }
            else
            {
                Console.WriteLine("Mr.Ming说:“好的,马上去买。省下的钱全当劳务费了哦!”\n");
            }
        }
        static void MrZhang(object sender, MaiPiaoEventArgs e)
        {
            Console.WriteLine("Mr.Zhang说:“{0}块钱让我去买{1}的票,不够啊。害我白跑,NND!”\n", e.money, e.diFang);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("事件访问器应用示例之买车票");
            Publisher Pub1 = new Publisher(25); //创建发行者对象
            //订阅事件,均获得成功
            Pub1.MaiPiaoEvent1 += new Publisher.MaiPiaoEventHandler(MrZhang);
            Pub1.MaiPiaoEvent2 += new Publisher.MaiPiaoEventHandler(MrMing);
            Pub1.Start("上海",25);
            Console.WriteLine("--------------------------------------------------------");

            Publisher Pub2 = new Publisher(19); //创建发行者对象
            //订阅事件,MaiPiaoEvent2未成功订阅事件
            Pub2.MaiPiaoEvent1 += new Publisher.MaiPiaoEventHandler(MrZhang);
            Pub2.MaiPiaoEvent2 += new Publisher.MaiPiaoEventHandler(MrMing);
            Pub2.Start("上海", 19);

            Console.WriteLine("--------------------------------------------------------");
            //取消订阅事件
            Pub2.MaiPiaoEvent1 -= new Publisher.MaiPiaoEventHandler(MrZhang);
            Pub2.MaiPiaoEvent2 -= new Publisher.MaiPiaoEventHandler(MrMing);
            Pub2.Start("上海", 25);
            Console.ReadKey();
        }
    }
}

posted @ 2012-06-05 13:41  keyen  阅读(432)  评论(0编辑  收藏  举报