四.把一個方法賦值給一個委託變量的這種機制,能夠實現把方法當作參數進行傳遞,若是一個方法,其參數是一個委託,則調用該方法時,就能夠把與該委託格式同樣的方法傳給形參.下面的代碼以List集合類型裏面的RemoveAll方法爲例:設計模式 [C] 純文本查看 複製代碼this List<int> list = new List<int>(); list.Add(123); list.Add(123); list.Add(234); list.Add(123); list.RemoveAll((int a) => { if (a == 123) { return true; } return false; }); foreach (int s in list) { Console.WriteLine(s); } 先看一下RemoveAll方法的原型,public int RemoveAll(Predicate<T> match);進入到API裏面,看到其形參是一個委託類型,原型爲:public delegate bool Predicate<in T>(T obj);T爲泛型類型佔位符,上面的代碼中list中用的是int類型,故此委託裏面的T也爲int,委託的原型爲返回值爲bool類型,參數爲int類型,在調用方法時,用的是lambda表達式,參數是int類型的a,方法體裏面的返回值類型爲bool類型,a會遍歷集合裏面的全部元素,只要等於123,返回爲true,就會把123從集合裏面刪除掉,遍歷完一遍後,把集合裏面的123所有刪除了,輸出的結果只有234了.spa 五.委託能夠綁定多個方法這種特性,能夠用在設計模式上面,下面有個Unity的一個Demo,先看一下截圖: 屏幕快照 2015-09-15 下午10.13.47.png (100.63 KB, 下載次數: 0)設計 下載附件code 前天 22:45 上傳orm 工程運行前,場景中有四個帶顏色的物體,中間是一個小球,而後移動小球,與四個物體中的任何一個碰撞後,再按下空格鍵,則把碰撞過的物體顏色改成藍色.效果圖以下: 屏幕快照 2015-09-15 下午10.14.11.png (19.95 KB, 下載次數: 0)對象 下載附件繼承 前天 22:45 上傳接口 其主要的思想就是:在移動的小球的腳本里面,定義了一個接口類型的變量,在其它四個物體的腳本都繼承接口,接口類裏面有一個委託屬性,只有get方法,而後四個物體的腳本都繼承該接口,實現接口裏面的屬性,委託屬性的返回值是其腳本里面的方法,其格式和定義的委託格式同樣,當移動的小球與四個物體碰撞後,就把所碰撞物體腳本組件賦值給移動小球腳本組件裏面的接口變量,而後再調用相對應的委託變量所返回的方法,把相對應的物體的顏色改變便可.下面是代碼: 腳本一是綁定在四個帶有顏色物體上的腳本組件 [C] 純文本查看 複製代碼ci using UnityEngine; using System.Collections; public class EnemyHurt : MonoBehaviour,IEventInterface { public HurtDelegate hurtdelegate { get { return Hurt; } } public void Hurt () { //把物體材質的顏色變成黑色,表明已死亡 transform.renderer.material.color = Color.blue; } }下面兩個腳本是加到移動小球上面的: 腳本二. [C] 純文本查看 複製代碼 using UnityEngine; using System.Collections; //此腳本是用來控制小球移動的 public class Move : MonoBehaviour { //小球移動的速度 public float speed = 3.0f; void Update () { //獲得橫豎虛擬軸的值 float hor = Input.GetAxis ("Horizontal"); float vec = Input.GetAxis ("Vertical"); //小球的移動 transform.position += new Vector3 (hor, 0, vec) * Time.deltaTime * speed; } }腳本三: [C] 純文本查看 複製代碼 using UnityEngine; using System.Collections; public class Boom : MonoBehaviour { //定義一個接口的屬性,因爲敵人繼承了該接口,只須要把子類的對象賦值給該接口變量便可執行子類裏面的方法 public IEventInterface eventInterface{ get; set; } //碰撞檢測,當小球與四個物體發生碰撞時, void OnCollisionEnter (Collision other) { //若是碰撞物體的父物體不爲空而且父物體的名字是Enemies時 if (other.transform.parent != null && other.transform.parent.name == "Enemies") { //接口變量指向子類的對象,就會調用所指向的子類裏面的委託. this.eventInterface = other.transform.GetComponent<EnemyHurt> (); } } // Update is called once per frame void Update () { //當按下空格鍵時,調用委託,實際上調用的就是接口變量所指向的子類裏面的委託,而 //其委託又返回的是子類裏面的方法 if (Input.GetKeyDown (KeyCode.Space)) { this.eventInterface.hurtdelegate (); } } } 腳本四:是一個公有的文件其它腳本組件能夠引用該文件裏面的接口 [C] 純文本查看 複製代碼 using UnityEngine; using System.Collections; //聲明一個委託 public delegate void HurtDelegate (); //建立一個接口 public interface IEventInterface { //聲明一個委託屬性 HurtDelegate hurtdelegate{ get; } } 如下是Unity場景裏面的各物體之間的父子關係圖: 屏幕快照 2015-09-15 下午10.27.44.png (12.33 KB, 下載次數: 0) 前天 22:45 上傳 以上就是關於委託的應用,因爲書寫時間倉促,有什麼問題還請各位大神多多指教. |