委托机制(C#)

来源:互联网 发布:金牛教育网络视频 编辑:程序博客网 时间:2024/06/05 16:06

附加:委托机制

注意:Java没有委托机制!!

案例:

有一只猫叫TOM,两只老鼠Jerry和Jack,Tom只要叫一声“喵,我是TOM”,两只老鼠就说“猫来了,快跑”然后逃跑。

委托的本质

委托(Handler)是对函数的封装,是一种类,事件标识(event)则是委托的一种特殊形式(注意此处不是Event对象,不负责传递事件信息),是一种特殊的委托类,事件对象则是一个函数。

委托是一种方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

委托的实现(三步):

Ø  Public delegate void CatShoutEventHandler();//委托类的声明,说明创建了一个委托类,是一个函数类,即该类的对象都是函数。

Ø  Public event CatShoutEventHandler CatShout;//事件的声明,即特殊委托类对象CatShout对象的声明;建立了一个CatShout对象,该对象是一个函数的实例,因为委托类是函数的封装,本质是一个函数类。

Event标识是说,如果发生了其他类或对象关注的事情时,委托类或对象(CatShout)可通过事件(EventArg)通知他们

Ø  Cat.CatShout +=new Cat.CatShoutEventHandler(mouse1.run);//给委托分配方法。

具体参见《大话设计模式》附录一中的委托

using System;using System.Collections.Generic;using System.Text;namespace 动物练习{    class Program    {        static void Main(string[] args)        {            Cat cat = new Cat("Tom");            Mouse mouse1 = new Mouse("Jerry");            Mouse mouse2 = new Mouse("Jack");            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);//给委托分配方法。            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);//给委托分配方法。            cat.Shout();            Console.Read();        }    }    //无参数委托事件    //class Cat    //{    //    private string name;    //    public Cat(string name)    //    {    //        this.name = name;    //    }    //    public delegate void CatShoutEventHandler();    //    public event CatShoutEventHandler CatShout;    //    public void Shout()    //    {    //        Console.WriteLine("喵,我是{0}.", name);    //        if (CatShout != null)    //        {    //            CatShout();    //        }    //    }    //}    //class Mouse    //{    //    private string name;    //    public Mouse(string name)    //    {    //        this.name = name;    //    }    //    public void Run()    //    {    //        Console.WriteLine("老猫来了,{0}快跑!", name);    //    }    //}    //有参数委托事件    class Cat    {        private string name;        public Cat(string name)        {            this.name = name;        }        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);//委托类的声明,说明创建了一个委托类,是一个函数类,即该类的对象都是函数。        public event CatShoutEventHandler CatShout;//事件的声明,即特殊委托类对象CatShout对象的声明;建立了一个CatShout对象,该对象是一个函数的实例,因为委托类是函数的封装,本质是一个函数类。Event标识是说,如果发生了其他类或对象关注的事情时,委托类或对象(CatShout)可通过事件(EventArg)通知他们        public void Shout()//1        {            Console.WriteLine("喵,我是{0}.", name);            if (CatShout != null)            {                CatShoutEventArgs e = new CatShoutEventArgs();//传递的信息存放在CatShoutEventArgs中,以函数形参的形式传递。                e.Name = this.name;                CatShout(this, e);//2            }        }    }    public class CatShoutEventArgs : EventArgs    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }    }    class Mouse    {        private string name;        public Mouse(string name)        {            this.name = name;        }        public void Run(object sender, CatShoutEventArgs args)//3        {            Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);        }    }}


0 0