C# 发布和订阅2

using System;

namespace ConsoleApp6
{
class Program
{

/*
背景:由于委托能引用方法,且能链接和删除其他委托对象
步骤:
①定义委托类型,并在发布者类中定义一个类型的共有成员
②在订阅者类中定义委托处理方法
③订阅者对象将其事件处理方法链接到发布者对象的委托成员(一个委托类型的引用)上。
④发布者对象在特定的情况下“激发”委托操作,从而自动调用订阅者对象的委托处理方法、
*/
static void Main(string[] args)
{
//创建学校铃声类
SchoolRing sr = new SchoolRing();
//创建学生实例
Students ss = new Students();
//订阅铃声委托
ss.SubscribeToRing(sr);
Console.WriteLine("请输入铃声参数(1表示上课;2表示下课)");
//打铃动作
sr.Jow(Convert.ToInt32(Console.ReadLine()));
Console.ReadLine();

}
}

/// <summary>
/// 声明一个委托类型
/// </summary>
/// <param name="ringKind"></param>
public delegate void RingEvent(int ringKind);

/// <summary>
/// 学校的铃声
/// </summary>
public class SchoolRing
{
public event RingEvent OnBellSound;//委托发布
//(插入知识点:添加event 以保证事件订阅可靠性,在发布委托的定义中加上event)
//读取输入,并且做出判断
public void Jow(int ringKind)
{
if (ringKind == 1 || ringKind == 2)
{
Console.WriteLine(ringKind==1?"":"");
///不等于空,说明它已订阅了具体的方法
if (OnBellSound!=null)
{
//回调OnBellSound委托所订阅(引用)的具体方法
OnBellSound(ringKind);
}
}
else
{
Console.WriteLine("这个铃声参数不正确");
}
}

}


/// <summary>
/// 学生类
/// </summary>
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;
}
}

}

 

转载:https://blog.csdn.net/Linlietao0587/article/details/112131243

posted @ 2022-06-11 10:56  .net&new  阅读(179)  评论(0编辑  收藏  举报