cocos2d-x系列笔记(9.1)---浅谈cocos2d-x使用函数指针实现委托(上)---通过c#代码理解委托
2013-03-14 13:26
701 查看
关于委托,我是这样理解的:A接受到一个请求,要对某些事物进行处理,但A目前不知道该怎样处理这个事物,就把处理该事物的工作交给B以后去做.A会给B定义出一个函数的模板,指示B该去实现一个什么样的函数去处理这件事物.事物的处理由B全权负责,而A只负责适时通知B什么时候该处理此事物.
有点拗口,我们来看个c#的例子:
从Main函数中我们看到,实例化了一个A对象,并且让A去执行一个加法操作,并带入两个加数3与2.下面我们来看看A类中是如何操作的.
我们看到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是如何实现加法操作的.
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中如何实现委托机制.
有点拗口,我们来看个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中如何实现委托机制.
相关文章推荐
- cocos2d-x系列笔记(9.2)---浅谈cocos2d-x使用函数指针实现委托(下)
- c#通过委托delegate与Dictionary实现action选择器代码举例
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- 通过代码学习C#&.NET——委托使用(通用类设计)
- 通过代码学习C#&.NET——委托使用(通用类设计)
- 通过代码学习C#&.NET——委托使用(线程、任务)
- C#中通过使用Connection类来实现打开/关闭数据库的代码实例
- 通过代码学习C#&.NET——委托使用(正则表达式替换)
- Androidx学习笔记(67)--- 使用代码注册广播接收者(实现屏幕锁屏和解锁)
- 改进C#代码之24:通过定义并实现接口替代继承
- 使用C#实现在屏幕上画图效果的代码实例
- 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果
- 黑马程序员 C#学习笔记① 使用WPF实现简易计算器
- 深入理解 c# 第五章 使用多个委托来捕获多个变量实例
- C#强化系列文章九:代码访问安全性使用
- C#基础系列:实现自己的ORM(MiniORM的测试代码)
- JAVA通过反映方法实现C#的委托
- 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试
- 简介 WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对
- C# 下使用委托跨窗体调用函数和控件的实现