您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x系列笔记(9.1)---浅谈cocos2d-x使用函数指针实现委托(上)---通过c#代码理解委托

2013-03-14 13:26 701 查看
关于委托,我是这样理解的:A接受到一个请求,要对某些事物进行处理,但A目前不知道该怎样处理这个事物,就把处理该事物的工作交给B以后去做.A会给B定义出一个函数的模板,指示B该去实现一个什么样的函数去处理这件事物.事物的处理由B全权负责,而A只负责适时通知B什么时候该处理此事物.

有点拗口,我们来看个c#的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleDelegateTest
{
class Program
{
static void Main(string[] args)
{
//让A执行3+2的操作
new A().executeAdd(3,2);
}
}
}


从Main函数中我们看到,实例化了一个A对象,并且让A去执行一个加法操作,并带入两个加数3与2.下面我们来看看A类中是如何操作的.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleDelegateTest
{

public class A
{
//定义一个加法操作的委托,让其他类帮助A进行加法操作
public delegate int AddDelegate(int a, int b);
/// <summary>
/// 让A去执行x+y的操作,但A当前并不知道x+y如何操作
/// </summary>
/// <param name="x">要处理的数据x</param>
/// <param name="y">要处理的数据y</param>
public void executeAdd(int x,int y)
{
B b = new B();                                      //实现了一个B实例
int z = b.delegateInstance.Invoke(x, y);            //通知b去做x+y的操作
Console.WriteLine("delegate invoke result:" + z);   //打印x+y后的结果
}
}
}


我们看到A类中并没有执行直接进行加法操作.因为当前A不知道加法操作该如何做(假设不会-_-!),这时A定义了一个委托public delegate int AddDelegate(int a,int b);我们看到委托的名字是AddDelegate,它代表了有a和b两个参数并返回一个int型数据的函数.

接下来我们继续看executeAdd函数中是如何执行的。函数中实例化了一个b,并通过b的委托实例delegateInstance执行了Invoke函数带入要做加法的两个参数.最后打印出结果.

这段代码中,我们并没有看到加法是如何操作的,只看到了在executeAdd函数中A通过委托实例delegateInstance通知了b去执行加法操作.如此看来真正的加法操作是在B中执行的,那我们继续看看B是如何实现加法操作的.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleDelegateTest
{
public class B
{
//实现A类加法委托的实例
public A.AddDelegate delegateInstance;
public B()
{
//将Add函数代入委托,让委托知道该去执行Add方法
delegateInstance = new A.AddDelegate(Add);
}
/// <summary>
/// 实现加法操作的方法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Add(int a, int b)
{
return a + b;
}
}
}


B中首先定义了一个A.AddDelegate委托的变量delegateInstance,并在构造函数中实例化了delegateInstance.值得我们注意的是A.AddDelegate构造函数中的参数Add.Add是一个同A.AddDelegate具有相同结构的函数,在Add中才真正的实现了加法操作,返回相加后的结果.

有了上述例子,我们再来理解一下文章开头对委托的定义,我们来逐句理解:A接受到一个请求,要对某些事物进行处理,(这个请求就是Main函数中对A的excuteAdd方法的调用)但A目前不知道该怎样处理这个事物,就把处理该事物的工作交给B以后去做.(A中并没有定义加法的具体操作方法)A会给B定义出一个函数的模板,指示B该去实现一个什么样的函数去处理这件事物.(A中定义了public
delegate int AddDelegate(int a, int b);告诉B加法要用这种形式的函数去处理)事物的处理由B全权负责,(在B中我们定义了Add函数进行了加法操作)而A只负责适时通知B什么时候该处理此事物.(A调用了Invoke函数通知B去执行Add函数执行加法操作)

因为委托的概念是在C#中发扬光大的,c#对委托的支持也非常好,代码更容易理解,所以我这里拿出了c#代码先做了讲解帮助我们理解委托.

下一讲我们会在理解委托的基础之上,去详细了解一下cocos2d-x中如何实现委托机制.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐