一、前提:
最近在备战软考,复习观察者模式的过程中再次接触到了委托和事件。可谓是一脸懵逼啊,看来欠下的总是要还的,当初委托和事件匆匆而过,没有留下丝毫痕迹,今天还需再战。
二、生活中类“委托”示例:
张三、李四、王五三个人是大学同学,一天,他们三个人同时收到了申通快递的短信,需要去拿快递,由于王五吃苦耐劳,为人陈恳。因此,张三、李四一合计,把取快递的任务“委托”给了王五,让他一并取回。这就是现实生活中非常常见的“委托”。
三、定义:
委托是对函数的封装,是函数的“类”。委托的实例将代表一个具体的函数。而事件是委托的一种特殊形式。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。而且,一个委托可以搭载多个方法。简单来说,委托是一种方法容器,里面可以装载若干个拥有相同参数和返回值类型的方法。那么调用委托,就相当于同时调用了该容器内的所有方法。委托可以将方法作为参数传递给方法。
委托对象用关键字delegate来声明。事件对象用event关键字声明。
四、实战:
声明一个委托,名称叫“CatShotEventHandler”,无参数,无返回值。
public delegate void CatShotEventHandler();
声明一个public事件CatShout,它的事件类型是委托CatShotEventHandler。这表明事件发生时,执行被委托的方法。
1、Cat类
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}
public delegate void CatShoutEventHandler();//声明委托CatShoutEventHandler
public event CatShoutEventHandler CatShout; //声明事件CatShout,它的事件类型是委托CatShoutEventHandler
public void shout()
{
Console.WriteLine("喵,我是{}.",name);
if(CatShout !=null)
{
CatShout();//当执行Shout()方法时,如果事件 CatShout中有对象登记事件,则执行CatShout()
}
}
}</span></span>
2、Mouse类
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run()
{
Console.WriteLine("老猫来了,{}快跑!",name);
}
}
</span></span>
Cat类和Mouse类和我们以往声明类的方式相差不多。关键是Main函数的写法。
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");
cat.CatShout += new Cat.CatShoutEventHanler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
// "+="表示Add,增加委托实例对象。表示将Mouse的Run方法通过<strong>实例化</strong>委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。
cat.Shout();
Console.Read();
}</span></span>