新知识点:EventHandler学习

EventHandler 是事件定义的的一种,它拥有两个参数,一个是Object 类型的sender , 另 一个是继承自EvebtArgs的参数e,一般它的写法如下:

using UnityEngine;
using System.Collections;
using System;

/// <summary>
/// 定义事件的类。
/// 其中NewCarInfo代表事件名,它的作用是注册它所触发的事件方法
/// RaiseNewCarInfo方法的作用修饰NewCarInfo并将这个类与目标数据类关联起来(具体什么作用我也不清楚)
/// </summary>
public class MyTestScript {

    public event EventHandler<CarInfoEventArgs> NewCarInfo;
    public void NewCar(string car)
    {
        Debug.Log("CarDealer,new car" + car);
        RaiseNewCarInfo(car);
    }

    protected virtual void RaiseNewCarInfo(string car)
    {
        EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
        if(newCarInfo!= null)
        {
            newCarInfo(this, new CarInfoEventArgs(car));
        }
    }

}

//这个类是继承EventArgs,用来存储数据
public class CarInfoEventArgs : EventArgs
{
    public CarInfoEventArgs(string car)
    {
        this.Car = car;
    }
    public string Car { get; set; }
}

下面我们再来定义一个订户的类,即订阅上面这个事件的客户类,它拥有一些行为,而且它一般会有多个实例,将它们实例的行为注册进入上文事件类NewCarInfo中后,就可以统一给所有注册过事件的实例发消息了,并控制这些实例什么时候做什么事情。具体如下:

/// <summary>
/// 客户类的定义,它拥有一个名字属性,以及一个NewCarIsHere方法
/// NewCarIsHere方法带有2个参数,这两个参数一定要与事件类中的EventHandler的参数一致,因为这个方法是要注册到事件中的
/// NewCarIsHere内的行为就是客户类的行为。
/// </summary>
public class TheCustomer
{
    private string name;
    public TheCustomer(string name)
    {
        this.name = name;
    }

    public void NewCarIsHere(object sender, CarInfoEventArgs e)
    {
        Debug.Log(name + "car" + e.Car + "is new");
    }
}```

既然事件定义类和客户类都已经定义完毕,下面就是程序的主体部分。
首先将事件类和客户类都实例化,并且多实例几个客户类,将这些客户类的方法都注册进入事件类的实例中。此时,只要调用一次事件类实例中NewCar的方法,就可以将所有注册过的客户类实例的方法都执行一遍。具体如下:

public class Customer : MonoBehaviour {

void Start()
{
    MyTestScript dealer = new MyTestScript();  //建立一个事件类的实例
    TheCustomer mao = new TheCustomer("Mao");//建立一个客户类的实例

    dealer.NewCarInfo += mao.NewCarIsHere;//将客户类的一个方法注册进事件类中
    dealer.NewCar("Ferrari");  //给所有注册了事件类的客户类发消息,通知他们执行自己的方法,即NewCarIsHere

    TheCustomer lu = new TheCustomer("Lu");//再建立一个客户类的实例
    dealer.NewCarInfo += lu.NewCarIsHere;//将这个新客户类的方法也注册到之前的事件类中
    dealer.NewCar("Mercedes");//给所有注册了事件类的客户类发消息,通知他们执行自己的方法,即NewCarIsHere

    dealer.NewCarInfo -= mao.NewCarIsHere;//把第一个客户类的实例的方法删掉
    dealer.NewCar("Red Bull Racing");//再次通知,因为此时事件类中已经注册的客户只剩下Lu了,所以只会有lu的方法会被执行
}

}“`

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值