C#委托与代理
来源:互联网 发布:APP登录HTML源码 编辑:程序博客网 时间:2024/04/30 01:14
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 http://blog.sina.com.cn/s/blog_471132920101ejb5.html
使用delegate的好处
规则由publisher制定,统一,适合打框架,有类似c++头文件的好处。 而传统程序规则为 subscriber制定,分散。
如果是个人开发,publisher是逻辑主类,subscriber是处理具体功能得类
如果是团队开发,publisher是主程,subscriber是 各个程序
如果是跨公司开发,publisher是SDK,subscriber是 使用SDK的程序
首先介绍函数签名这个概念。
规则由publisher制定,统一,适合打框架,有类似c++头文件的好处。
如果是个人开发,publisher是逻辑主类,subscriber是处理具体功能得类
如果是团队开发,publisher是主程,subscriber是 各个程序
如果是跨公司开发,publisher是SDK,subscriber是 使用SDK的程序
首先介绍函数签名这个概念。
函数签名:参数和返回值 的格式 组成函数签名
void AAA(string a)
void BBB(string name)
我们说AAA和BBB具有相同的函数签名。
Delegate实际就是对 相同函数签名 的函数的使用。相当于c++里的函数指针。
使用方法
第一步:定义 Delegate,也就是签名格式。
第二步:创建Delegate的对象,并添加符合签名的具体函数。
第三步:使用Delegate对象
如果delegate对象 和 具体函数 在不同类里的话,那么就构成了 sender- reciever 或者说publisher - subscriber模型。
其中delegate和 delegate承载的handler(handler可以是任何相同函数签名的函数,在函数名后在Handler后缀只是为了好区分)。
而参数可以专门封装在一个继承EventArgs的类里,也可以使用Hashtable.
如果delegate对象前面不加event的话。那么该对象实际是一个参数。
而加event的唯一目的是 让该代理既可以加处理函数,又封装在类里。
命名一般是 代表是xxxDelegate 处理函数xxxHandler。
示例
- //**************************************************************************
- //
- //Delegate:单独delegate
- //
- //**************************************************************************
- using UnityEngine;
- using System.Collections;
- public class TestDelegate : MonoBehaviour {
- public delegate void PrintGMDelegate(string name);
- public void PrintCN(string name)
- {
- print("譌ゥ荳雁・ス, "+name);
- }
- public void PrintEN(string name)
- {
- print("Good morning, "+name);
- }
- public void PrintDelegate(string name,PrintGMDelegate Make)
- {
- Make(name);
- }
- void Start () {
- PrintGMDelegate dele1;
- dele1 = PrintCN;
- dele1 += PrintEN;
- dele1 -= PrintCN;
- //PrintDelegate("Jackie",dele1);
- dele1("Jackie");
- }
- //**************************************************************************
- //
- //Delegate: Sender - receiver模型
- //
- //**************************************************************************
- using UnityEngine;
- using System.Collections;
- public delegate void Pt();
- public class Sender
- {
- public event Pt apt;
- public void DO()
- {
- apt();
- }
- }
- public class Receiver
- {
- public void Receiving()
- {
- Debug.Log("i got it");
- }
- }
- public class TestDelegate : MonoBehaviour {
- public void Start()
- {
- Sender sender = new Sender();
- Receiver receiver = new Receiver();
- sender.apt += receiver.Receiving;
- sender.DO();
- }
- }
- //**************************************************************************
- //
- //Delegate: Sender - receiver + EventArgs模型
- //
- //**************************************************************************
- using UnityEngine;
- using System.Collections;
- using System;
- public delegate void PtHandler(MyArgs e);
- public class Sender
- {
- public PtHandler apt;
- public void DO(MyArgs e)
- {
- apt(e);
- }
- }
- public class MyArgs:EventArgs
- {
- public int num;
- public MyArgs(int tmp)
- {
- num = tmp;
- }
- }
- public class Receiver
- {
- public void Receiving(MyArgs e)
- {
- Debug.Log("i got number: "+e.num);
- }
- }
- public class TestDelegate : MonoBehaviour {
- public void Start()
- {
- Sender sender = new Sender();
- Receiver receiver = new Receiver();
- MyArgs e = new MyArgs(10);
- sender.apt += receiver.Receiving;
- // sender.DO(e);
- sender.apt(e);
- }
- }
- //**************************************************************************
- //
- //Delegate: Sender - receiver + Hashtable
- //任意数量的参数,只有返回值格式的限制,没有参数的限制
- //
- //**************************************************************************
- using UnityEngine;
- using System.Collections;
- using System;
- public delegate void PtHandler(Hashtable e);
- public class Sender
- {
- public PtHandler apt;
- public void DO(Hashtable e)
- {
- apt(e);
- }
- }
- public class Receiver
- {
- public void Receiving(Hashtable e)
- {
- Debug.Log("i got number: "+e["num"]);
- }
- }
- public class TestDelegate : MonoBehaviour {
- public GameObject obj;
- public void Start()
- {
- Sender sender = new Sender();
- Receiver receiver = new Receiver();
- sender.apt += receiver.Receiving;
- Hashtable tab = new Hashtable();
- tab["num"] =101;
- sender.apt(tab);
- }
- }
0 0
- C#委托与代理
- C#委托与代理
- C#委托与代理模式
- C# 委托 代理
- Unity3d C# 广播消息 事件代理与委托
- 协议,委托与代理
- IOS代理协议与委托
- IOS代理协议与委托
- c# 委托与事件
- c# 委托与多线程
- C#委托与事件
- C# 委托与事件
- c#委托与事件
- C# - 委托与事件
- C#委托与事件
- C# 委托与事件
- C#委托与事件
- c#委托与事件
- 断线的风筝
- Java中的反射的应用
- 好玩的Windows编程之"本地时间"(1)binaryclock
- MyBatis入门实例简介
- c++重拾的记忆
- C#委托与代理
- 第七章代码
- 函数指针的一些小理解
- Provider-Defined Properties in DBPROPSET_JETOLEDB_DBINIT
- PPT单一对象设置多个动作、多个对象设置同一动作
- 第七章代码2
- J2ME的小飞机游戏
- 2440 Linux按键驱动及测试程序
- Cocos2D-x游戏开发之二:菜单事件响应