新知識點: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的方法會被執行
}

}“`

發佈了36 篇原創文章 · 獲贊 29 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章