通俗易懂大白话之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

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

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

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

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

原文地址:https://www.cnblogs.com/Mex13/p/8027438.html