基础知识篇:委托与事件

17 篇文章 0 订阅
6 篇文章 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行代码声明了CatShoutEventArgs 
        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; }
        }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值