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;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107152.html