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

 

大家再想一想, 如果還有趙雲,馬超,黃忠等等更多將領呢?

程序拓展也非常方便, 定義好新將領的類並實現殺出方法即可, 和關羽張飛代碼類似;

使用設計模式的話,  可以建立一個將領的父類, 實現基本的殺出方法. 如果個別將領有特別的殺出方法, 重寫殺出方法即可.

如果有不對的地方歡迎指出 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM