委托是对函数的封装,可以当做给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事的时候,事件对象 处理通知过程。
注意
1.委托是一种引用方法的类型。一旦为委托分配了方法,委托就与该方法具有完全相同的行为。
2.事件是在发生其它类或对象关注的事情的时候,类或对象可通过事件通知他们。
3.委托对象用delegate声明,事件对象用event声明。
using System;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");
/*
* 表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中,
* 其中+=表示‘add_CatShout’的意思。即给委托事件添加方法。同理-=给委托事件减少方法
* 注意,添加的方法参数必须与委托的参数一致。(个数,类型)!!!
* */
cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
//当事件触发时,通知所有登记过的对象,并将发送通知的自己以及需要的数据传递过去。
cat.Shout();
}
class Cat
{
private string name;
public Cat (string name)
{
this.name = name;
}
//声明委托CatShoutEventHandler
//此时有两个参数,类参数(传递发送通知的对象)和EventArgs子类参数。EventArgs是包含事件数据的类的基类。
//第63行代码声明了CatShoutEventArgs
public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs args);
//声明事件CatShout,它的事件类型是委托CatShoutEventHandler
public event CatShoutEventHandler CatShout;
public void Shout()
{
Debug.Log ("喵,我是"+name);
//当执行Shout()方法时,如果CatShout中有对象登记事件,则执行CatShout()
if(CatShout!=null)
{
CatShoutEventArgs e = new CatShoutEventArgs();
e.Name = this.name;
CatShout(this,e);
}
}
}
class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run(object sender,CatShoutEventArgs args)
{
Debug.Log(args.Name+"来了," + name + "快跑!");
}
}
public class CatShoutEventArgs : EventArgs
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
}