C#实现代理模式
2015-05-29 11:53
405 查看
昨天有个朋友问我在Unity3D中如何使用代理。我简单的给他说了一下,可是他还是希望我能写出来。既然不是很麻烦,那么我就在博客里把这个例子写出来。C#语言是支持代理的,并且代理是非常的好用的一种方式。简单的来说就是 你委托朋友帮你做一件事情,当你的朋友做完以后会告诉你。 代码中一般A、B、C、D若干类同时委托E类来做一件事情,当这件事情E类完成时会同时回调A、B、C、D类中的方法,大概就是这个意思拉。
回到Unity3D中,我们写一个简单的例子,Test.cs委托Log.cs 办一件事情,当Log.cs办完后在Test.cs回调委托的方法。代码比较简单我们直接将Test.cs Log.cs 绑在摄像机上,运行就能看到效果。。上代码!!!
Log.cs
我解释一下。委托的标识符就是delegate ,上述代码的DoOnething(string str) DoTwothing(string str)就是委托完毕后回调的方法名称,doOne doTwo这两个是委托的事件,在Start方法中通过委托的事件将委托的参数传递进去即可实现委托。在开发中应该有一个专门用来委托的类,在DoOne DoTwo方法之上应该执行对应对托的相关代码。不一定是在Start方法中,静态调用对象皆可。
接着再看看Test.cs
在OnEnabel和OnDisable中启动与关闭委托,这也是为什么Log.cs中要判断一下委托是否为空。如果为空的话是会有错误的。比如
Log.doOne += DoOnething;
这段代码的意思就是为委托事件赋值,让本类的DoOnethine(string str)方法接受委托传递回来的事件,这里起到一个回调的作用。
Log.doOne -= DoOnething;
就是释放当前的委托事件,因为Log.doOne是一个静态类型的变量,不用的时候把他关掉,一旦关掉后,DoOnething方法就接收不到回调信息了,除非再次 += 添加。
最后就是当Log.cs中调用 doOne(“yusong”);的时候,实际上就是回调Test.cs中的 DoOnething(string str);
运行一下看看效果大家就明白啦。
昨天有个朋友问我在Unity3D中如何使用代理。我简单的给他说了一下,可是他还是希望我能写出来。既然不是很麻烦,那么我就在博客里把这个例子写出来。C#语言是支持代理的,并且代理是非常的好用的一种方式。简单的来说就是 你委托朋友帮你做一件事情,当你的朋友做完以后会告诉你。 代码中一般A、B、C、D若干类同时委托E类来做一件事情,当这件事情E类完成时会同时回调A、B、C、D类中的方法,大概就是这个意思拉。
回到Unity3D中,我们写一个简单的例子,Test.cs委托Log.cs 办一件事情,当Log.cs办完后在Test.cs回调委托的方法。代码比较简单我们直接将Test.cs Log.cs 绑在摄像机上,运行就能看到效果。。上代码!!!
Log.cs
[代码]:
using UnityEngine; using System.Collections; public class Log :MonoBehaviour { public delegate void DoOnething(string str); public static event DoOnething doOne; public delegate void DoTwothing(string str); public static event DoTwothing doTwo; void Start () { if(doOne != null) { doOne("yusong"); } if(doTwo != null) { doTwo("momo"); } } }
我解释一下。委托的标识符就是delegate ,上述代码的DoOnething(string str) DoTwothing(string str)就是委托完毕后回调的方法名称,doOne doTwo这两个是委托的事件,在Start方法中通过委托的事件将委托的参数传递进去即可实现委托。在开发中应该有一个专门用来委托的类,在DoOne DoTwo方法之上应该执行对应对托的相关代码。不一定是在Start方法中,静态调用对象皆可。
接着再看看Test.cs
[代码]:
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { void OnEnable() { Log.doOne += DoOnething; Log.doTwo += DoTwothing; } void OnDisable() { Log.doOne -= DoOnething; Log.doTwo -= DoTwothing; } public void DoOnething(string str) { Debug.Log("DoOnething " + str); } public void DoTwothing(string str) { Debug.Log("DoTwothing " + str); } }
在OnEnabel和OnDisable中启动与关闭委托,这也是为什么Log.cs中要判断一下委托是否为空。如果为空的话是会有错误的。比如
Log.doOne += DoOnething;
这段代码的意思就是为委托事件赋值,让本类的DoOnethine(string str)方法接受委托传递回来的事件,这里起到一个回调的作用。
Log.doOne -= DoOnething;
就是释放当前的委托事件,因为Log.doOne是一个静态类型的变量,不用的时候把他关掉,一旦关掉后,DoOnething方法就接收不到回调信息了,除非再次 += 添加。
最后就是当Log.cs中调用 doOne(“yusong”);的时候,实际上就是回调Test.cs中的 DoOnething(string str);
运行一下看看效果大家就明白啦。
相关文章推荐
- 48. C# -- 事件
- C# 记录循环消耗时间
- C#中的Action<>和Func<>
- c#委托把方法当成参数(实例讲解)
- C#生成随机数
- C#unix时间戳转换
- 47. C# -- 匿名方法
- C#二叉树简易实例
- C#小知识点
- C#开发模式——dll多级引用的问题
- C# 基础学习第一天
- C# 注释(预定义的标签)
- c# 读取基目录下.config文件
- C#开源大全--汇总
- C#开源系统大汇总
- ArcEngine与C#添加shp文件的两种方式
- 总结C#获取当前路径的7种方法(转载)
- 如何用Nsight调试C# OpenGL程序
- 《C#程序设计》第五次作业
- C# WPF 实现英雄联盟图片 宝宝识图