C#委託的釋出和訂閱
阿新 • • 發佈:2021-01-04
技術標籤:c#
using System;
namespace 委託的釋出和訂閱
{
class Program
{
/*
背景:由於委託能引用方法,且能連結和刪除其他委託物件
步驟:
①定義委託型別,並在釋出者類中定義一個型別的共有成員
②在訂閱者類中定義委託處理方法
③訂閱者物件將其事件處理方法連結到釋出者物件的委託成員(一個委託型別的引用)上。
④釋出者物件在特定的情況下“激發”委託操作,從而自動呼叫訂閱者物件的委託處理方法、
*/
static void Main(string[] args)
{
//建立學校鈴聲類
SchoolRing sr = new SchoolRing();
//建立學生例項
Students students = new Students();
//訂閱鈴聲委託
students.SubscribeToRing(sr);
Console.WriteLine("請輸入大鈴聲引數(1:表示上課鈴;2:表示下課鈴):" );
//打鈴動作
sr.Jow(Convert.ToInt32(Console.ReadLine()));
Console.ReadLine();
}
}
/// <summary>
/// 宣告一個委託型別
/// </summary>
/// <param name="ringKind">表示鈴聲種類(1 表示上課鈴聲;2 表示下課鈴聲)</param>
public delegate void RingEvent (int ringKind);
public class SchoolRing
{
public event RingEvent OnBellSound;//委託釋出
//(插入知識點:新增event 以保證事件訂閱可靠性,在釋出委託的定義中加上event)
//讀取輸入,並且做出判斷
public void Jow(int ringKind)
{
if (ringKind ==1 || ringKind ==2)
{
Console.Write(ringKind == 1 ? "上課鈴響了," : "下課鈴響了");
if (OnBellSound !=null)
{//不等於空,說明它已訂閱了具體的方法
OnBellSound(ringKind);//回撥OnBellSound委託所訂閱(引用)的具體方法
}
}
else
{
Console.WriteLine("這個鈴聲引數不正確!");
}
}
}
public class Students
{
//學生訂閱鈴聲這個委事件
public void SubscribeToRing(SchoolRing schoolRing)
{
schoolRing.OnBellSound += SchoolJow;
}
//與上面關聯--執行事件
private void SchoolJow(int ringKind)
{
if (ringKind ==2)
{
Console.WriteLine("同學們開始課間休息");
}
else if(ringKind ==1)
{
Console.WriteLine("同學們開始認真學習");
}
}
//取消訂閱鈴聲動作
public void CancelSubscribe(SchoolRing schoolRing)
{
schoolRing.OnBellSound -= SchoolJow;
}
}
}