嗨嗨,今天接著介紹事件的進階用法 ~
建立新的類別,繼承 EventArgs
類別,以夾帶不同類型的資料至 EventHandler 中。
以下是範例程式碼。
public class CountdownEventArgs:EventArgs // 新的 EventArgs 類別
{
public string name; // 加入名稱做為簡單的示範
public CountdownEventArgs(string name){
this.name = name;
}
}
public class Countdown
{
int internalCounter;
string name;
public delegate void CountDownEventHandler(object sender, CountdownEventArgs e); // 建立一個自訂的 EventHandler 委派
public event CountDownEventHandler? CountdownCompleted; // 自訂的 EventHandler
public Countdown(int n, string name){ // 因示範緣故,直接傳入名稱
internalCounter = n;
this.name = name;
}
protected virtual void OnCountdownCompleted(CountdownEventArgs e) // 參數類型改為 CountdownEventArgs
{
if (CountdownCompleted != null)
CountdownCompleted(this, e);
}
public void Decrement()
{
internalCounter = internalCounter - 1;
if (internalCounter == 0)
OnCountdownCompleted(new CountdownEventArgs(name)); // 參數類型改為 CountdownEventArgs
}
}
public class Receiver{
public void Tip(object? sender , CountdownEventArgs eventArgs){ // 註冊的方法也要改為 CountdownEventArgs
Console.WriteLine(eventArgs.name + ": Tip!!!");
}
public void Run(){
Countdown countdown = new Countdown(3, "Example");
countdown.CountdownCompleted += Tip;
countdown.Decrement();
countdown.Decrement();
countdown.Decrement(); // 觸發事件: 結果為 Example: Tip!!!
}
}
需要在 Static Class 內實作事件時和一般事件的宣告類似,額外加入 static
關鍵字即可。
SomeEvent(null, EventArgs.Empty);
。可以多個方法註冊一個事件,當事件發生時,所有註冊該事件的方法都會被觸發。