C#委托的发布和订阅

导读:本篇文章讲解 C#委托的发布和订阅,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!