1. 程式人生 > >基礎知識篇:委託與事件

基礎知識篇:委託與事件

委託是對函式的封裝,可以當做給方法的特徵指定一個名稱。而事件則是委託的一種特殊形式,當發生有意義的事的時候,事件物件 處理通知過程。

注意

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; }
        }

    }

}