附加:委托机制
注意: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);
}
}
}