委托(Delegate)的详解

1、定义
        delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。
       它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。
       delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,运行时能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

2、委托的声明原型 
delegate <函数返回类型> <委托名> (<函数参数>)
public delegate void CheckDelegate(int number);
委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此。

3、委托的实例化
委托实例化的原型
<委托类型> <实例化名>=new <委托类型>(<注册函数>)
CheckDelegate checkDelegate=new CheckDelegate(CheckMod);

4、创建步骤
(1)声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
(2)创建delegate对象,并"将你想要传递的函数作为参数传入"。
(3)通过上一步创建的对象来调用方法

创建一个Subject对象
using System;

public class ConcreteSubject
{
	/// <summary>
	/// 声明委托
	/// </summary>
	public delegate void CustomerEventHandler(String state);

	// 声明一个委托事件,类型为 CustomerEventHandler
	public event CustomerEventHandler Update;

	static ConcreteSubject  instance;
	private string subjectState;

	/// <summary>
	/// 观察者理应是单利模式
	/// </summary>
	/// <value>The get.</value>
	public static  ConcreteSubject Get()
	{
		if(instance == null)
		{
			instance = new ConcreteSubject ();
		}
		return instance;
	}
		
	public void Notify(string state)
	{
		if (Update != null)
		{
			// 使用事件来通知给订阅者
			Update(state);
		}
	}
}
创建一个监听着
using System;
using UnityEngine;

public class ConcreteObserver
{
	
	public void GiveInvoice(string state)
	{
		Console.WriteLine("我是会计,我来开具发票。");
		Debug.Log ("===================GiveInvoice==============:"+state);
	}
}


使用的时候
ConcreteObserver observer_1 = new ConcreteObserver ();
ConcreteObserver observer_2 = new ConcreteObserver ();

ConcreteSubject.Get ().Update += observer_1.GiveInvoice;
ConcreteSubject.Get ().Update += observer_2.GiveInvoice;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章