基礎知識篇:委託與事件
阿新 • • 發佈:2018-12-11
委託是對函式的封裝,可以當做給方法的特徵指定一個名稱。而事件則是委託的一種特殊形式,當發生有意義的事的時候,事件物件 處理通知過程。
注意
1.委託是一種引用方法的型別。一旦為委託分配了方法,委託就與該方法具有完全相同的行為。
2.事件是在發生其它類或物件關注的事情的時候,類或物件可通過事件通知他們。
3.委託物件用delegate宣告,事件物件用event宣告。
using System; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () { Cat cat = new Cat("Tom"); Mouse mouse1 = new Mouse("Jerry"); Mouse mouse2 = new Mouse("Jack"); /* * 表示將Mouse的Run方法通過例項化委託Cat.CatShoutEventHandler登記到Cat的事件CatShout當中, * 其中+=表示‘add_CatShout’的意思。即給委託事件新增方法。同理-=給委託事件減少方法 * 注意,新增的方法引數必須與委託的引數一致。(個數,型別)!!! * */ cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run); cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run); //當事件觸發時,通知所有登記過的物件,並將傳送通知的自己以及需要的資料傳遞過去。 cat.Shout(); } class Cat { private string name; public Cat (string name) { this.name = name; } //宣告委託CatShoutEventHandler //此時有兩個引數,類引數(傳遞傳送通知的物件)和EventArgs子類引數。EventArgs是包含事件資料的類的基類。 //第63行程式碼聲明瞭CatShoutEventHandler public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs args); //宣告事件CatShout,它的事件型別是委託CatShoutEventHandler public event CatShoutEventHandler CatShout; public void Shout() { Debug.Log ("喵,我是"+name); //當執行Shout()方法時,如果CatShout中有物件登記事件,則執行CatShout() if(CatShout!=null) { CatShoutEventArgs e = new CatShoutEventArgs(); e.Name = this.name; CatShout(this,e); } } } class Mouse { private string name; public Mouse(string name) { this.name = name; } public void Run(object sender,CatShoutEventArgs args) { Debug.Log(args.Name+"來了," + name + "快跑!"); } } public class CatShoutEventArgs : EventArgs { private string name; public string Name { get { return name; } set { name = value; } } } }