1. 程式人生 > 其它 >C# 事件(event)案例

C# 事件(event)案例

技術標籤:C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 摔杯為號
{

    class Program
    {
        /// <summary>
        /// 首領A舉杯委託
        /// </summary>
        /// <param name="hand">手:左、右</param>
        public delegate void RaiseEventHandler(string hand);
        /// <summary>
        /// 首領A摔杯委託
        /// </summary>
        public delegate void FallEventHandler();

        /// <summary>
        /// 首領A
        /// </summary>
        public class CaptainA
        {
            /// <summary>
            /// 首領A舉杯事件
            /// </summary>
            public event RaiseEventHandler RaiseEvent;
            /// <summary>
            /// 首領A摔杯事件
            /// </summary>
            public event FallEventHandler FallEvent;

            /// <summary>
            /// 舉杯
            /// </summary>
            /// <param name="hand">手:左、右</param>
            public void Raise(string hand)
            {
                Console.WriteLine("首領A{0}手舉杯", hand);

                // 呼叫舉杯事件,傳入左或右手作為引數
                if (RaiseEvent != null)
                {
                    RaiseEvent(hand);
                }
            }

            /// <summary>
            /// 摔杯
            /// </summary>
            public void Fall()
            {
                Console.WriteLine("首領A摔杯");

                // 呼叫摔杯事件
                if (FallEvent != null)
                {
                    FallEvent();
                }
            }
        }

        /// <summary>
        /// 部下B
        /// </summary>
        public class GeneralB
        {
            CaptainA captainA;

            public GeneralB(CaptainA a)
            {
                this.captainA = a;
                a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent); // 訂閱舉杯事件
                a.FallEvent += new FallEventHandler(a_FallEvent); // 訂閱摔杯事件
            }

            /// <summary>
            /// 首領舉杯時的動作
            /// </summary>
            /// <param name="hand">若首領A左手舉杯,則B攻擊</param>
            private void a_RaiseEvent(string hand)
            {
                if (hand.Equals("左"))
                {
                    Attack();
                }
            }

            /// <summary>
            /// 首領摔杯時的動作
            /// </summary>
            private void a_FallEvent()
            {
                Attack();
            }

            /// <summary>
            /// 攻擊
            /// </summary>
            public void Attack()
            {
                Console.WriteLine("部下B發起攻擊,大喊:猛人張飛來也!");
            }
        }

        /// <summary>
        /// 部下C
        /// </summary>
        public class GeneralC
        {
            CaptainA captainA;
            public GeneralC(CaptainA a)
            {
                this.captainA = a;
                a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent); // 訂閱舉杯事件
                a.FallEvent += new FallEventHandler(a_FallEvent); // 訂閱摔杯事件
            }

            /// <summary>
            /// 首領舉杯時的動作
            /// </summary>
            /// <param name="hand">若首領A右手舉杯,則攻擊</param>
            private void a_RaiseEvent(string hand)
            {
                if (hand.Equals("右"))
                {
                    Attack();
                }
            }

            /// <summary>
            /// 首領摔杯時的動作
            /// </summary>
            private void a_FallEvent()
            {
                Attack();
            }

            /// <summary>
            /// 攻擊
            /// </summary>
            public void Attack()
            {
                Console.WriteLine("部下C發起攻擊,一套落英神掌打得虎虎生威~");
            }
        }

        static void Main(string[] args)
        {
            //首領A要搞一場鴻門宴,吩咐部下B和C各自帶隊埋伏在屏風兩側,約定以杯為令:
            //若左手舉杯,則B帶隊殺出;若右手舉杯,則C帶隊殺出;若直接摔杯,則B和C同時殺出。

            CaptainA captainA = new CaptainA(); // 定義首領A
            GeneralB generalB = new GeneralB(captainA); // 定義部下B
            GeneralC generalC = new GeneralC(captainA); // 定義部下C

            // 首領A左手舉杯
            captainA.Raise("左");

            // 首領A右手舉杯
            //captainA.Raise("右");

            // 首領A摔杯
            //captainA.Fall();

            Console.ReadKey();
        }
    }
}

執行:

1.左手舉杯:

2.右手舉杯

3.摔杯

end