Unity3d:委托、事件、Action

作者:KillerAery 出处:http://www.cnblogs.com/KillerAery/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1.委托delegate

//声明没有参数,没有返回值的委托类型XXXX
public delegate void XXXX();
//委托类型XXXX的对象
public XXXX delegateObj1;

public void func1(){}
public void func2(){}
public void func3(int a){}
//可将某个同样类型的函数赋给该对象
delegateObj1 = func1;

//调用委托对象等同于调用它代表的函数
delegateObj1();//等价于func1();

delegateObj1 = func2;
delegateObj1();//等价于func2();

delegateObj1 = func3;//类型不匹配,语法错误

2.event(事件)
单纯用委托的话只能一对一调用(一次调用,一个函数触发)。
而通过利用事件机制,我们可以实现一对多的调用(一次调用,多个相关事件(函数)触发)。
而且它添加/移除委托对象(相当于观察者模式里的观察者)的操作十分方便,使用+=或-=即可。

//先声明一个委托类型
public delegate void XXXX();
//委托事件对象
public event XXXX EventObj1;//此处比一般委托多了个event
EventObj1 += func1; //添加
EventObj1 += func2; //添加

EventObj1(); //调用func1(),func2()

EventObj1 -= func1; //移除
EventObj1(); //调用func2()

3.Action/Func
Action/Func主要是为了简化委托(delegate)语法,它们本质都是委托。

//无返还值,不带参数的委托对象
public delegate void XXXX();
public XXXX obj1;
//无返还值,不带参数的委托对象
public Action obj3;
//无返还值,带int参数的委托对象
public Action<int> obj4;

//double返还值,无参数的委托对象
public Func<double> obj5;
//int返还值,带string,double参数的委托对象
public Func<string,double,int> obj6;

//将Action应用至事件
public event Action<int> EventObj1;
EventObj1 += obj4;
EventObj1 += func1;
EventObj1 += func2;
EventObj1();//调用obj4(),func1(),func2()

结论
为了简化语法,可使用Action/Func而不是直接使用delegate,除非你想强调特殊的委托类型。
实现观察者模式,可以使用event和委托(Action/Func/delegate)搭配。更加完善的做法则是再搭配Dictionary,通过Key找到想要的委托事件对象列表,然后可以添加/移除/通知该对象的观察者。

你可能感兴趣的:(Unity学习笔记,unity3d)