• 通俗易懂大白话之C#委托与事件实例


    有关委托和事件的文章已经有很多, 之前看过一篇讲的实例比较形象, 因此借鉴并加以改进一下, 希望能够帮助还没有过这道坎的同学;

    借鉴文章: https://www.cnblogs.com/yinqixin/p/5056307.html

    本文没有任何概念介绍,旨在帮助同学们快速用上委托和事件,越过这道坎。

    应用场景举例:    

    刘备设鸿门宴, 吩咐关羽和张飞各自带队埋伏在门外,  刘备摔杯为号, 关羽和张飞则带队杀出;

    关羽和张飞杀出的具体过程, 他们自己实现即可.

    但刘备会不会摔杯, 什么时候摔杯 刘备自己也不知道..得看情况..

    所以当然不能用传统方式, 在刘备摔杯的方法里面调用关羽和张飞的杀出方法,

    如果刘备(BOSS)临时变卦, 要多安排赵云,马超,黄忠等等众多将领在门外呢?

    那刘备的摔杯方法岂不是要调用所有将领的杀出方法?

    这样写代码要传递众多将领对象, 刘备的摔杯方法会进行无尽的修改和完善,显然不是我们所希望的。

    使用委托和事件的实现方式:

    首先定义刘备,关羽,张飞3个类:

    刘备有摔杯的委托和事件, 以及摔杯方法;

    关羽和张飞则有杀出方法;

    public class 刘备
        {
            public delegate bool 摔杯委托(string str);
            public event 摔杯委托 摔杯事件;
    
            public void 摔杯方法()
            {
                if (摔杯事件 != null)
                    摔杯事件("猛猛的摔杯 (只是示例个参数)");
            }
        }
    
        public class 关羽
        {
            public bool 杀出(string str)
            {
                Console.WriteLine("关羽带300刀斧手从北门杀出!");
                return true;
            }
        }
    
        public class 张飞
        {
            public bool 杀出(string str)
            {
                Console.WriteLine("张飞带300刀斧手从南门杀出!");
                return true;
            }
        }
    View Code

    那么为了方便大家理解注册事件,  也就是关羽和张飞接受刘备的摔杯为号的约定, 我们先这样写:

    static class Program
        {
            static void Main()
            {
                刘备 lb = new 刘备();
                关羽 gy = new 关羽(lb);
                张飞 zf = new 张飞(lb);
                //分别注册事件
                lb.摔杯事件 += gy.杀出;
                lb.摔杯事件 += zf.杀出;
                //刘备摔杯
                lb.摔杯方法();
            }
        }
    View Code

    最终完整代码如下:

    (下面代码注册事件改为在对象内部实现)

    using System;
    
    namespace Test
    {
        static class Program
        {
            static void Main()
            {
                刘备 lb = new 刘备();
                关羽 gy = new 关羽(lb); //可以理解为, 刘备与关羽约定好摔杯杀出, 然后关羽自己注册事件
                张飞 zf = new 张飞(lb); //同上
                //刘备摔杯
                lb.摔杯方法();
            }
        }
    
        public class 刘备
        {
            public delegate bool 摔杯委托(string str);
            public event 摔杯委托 摔杯事件;
    
            public void 摔杯方法()
            {
                if (摔杯事件 != null)
                    摔杯事件("猛猛的摔杯 (只是示例个参数)");
            }
        }
    
        public class 关羽
        {
            public 关羽(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("关羽带300刀斧手从北门杀出!");
                return true;
            }
        }
    
        public class 张飞
        {
            public 张飞(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("张飞带300刀斧手从南门杀出!");
                return true;
            }
        }
    }
    View Code

    大家再想一想, 如果还有赵云,马超,黄忠等等更多将领呢?

    程序拓展也非常方便, 定义好新将领的类并实现杀出方法即可, 和关羽张飞代码类似;

    使用设计模式的话,  可以建立一个将领的父类, 实现基本的杀出方法. 如果个别将领有特别的杀出方法, 重写杀出方法即可.

    如果有不对的地方欢迎指出 

  • 相关阅读:
    Jenkins学习总结(1)——Jenkins详细安装与构建部署使用教程
    Maven学习总结(17)——深入理解maven灵活的构建
    Maven学习总结(16)——深入理解maven生命周期和插件
    Maven学习总结(16)——深入理解maven生命周期和插件
    DB2学习总结(1)——DB2数据库基础入门
    DB2学习总结(1)——DB2数据库基础入门
    Java基础学习总结(51)——JAVA分层理解
    关于人生的
    【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
    华为云文字识别服务产品优势、应用场景、典型案例和未来之路(OCR系列三)
  • 原文地址:https://www.cnblogs.com/Mex13/p/8027438.html
Copyright © 2020-2023  润新知