2012年12月7日金曜日

C# デリゲート6(イベントってなに?)

イベントってなに?
フォームでいうところのOnButtonClick()を自前でやる方法のこと。
そもそもイベントってなに?ということをたとえ話で説明すると、課長に相談したいんだけど電話中で、電話が終わったら課長から「電話おわったよ」と連絡がくるような仕組みのこと。
どうやって使う?
上に書いた例を参考にソースを書いてみた。課長 kousakuと 平社員だめおがいて、課長の電話が終わったタイミングでだめおが相談に行くというソースを書いてみた

課長と平社員側でそれぞれこのような実装を行う。結構大変。
[課長側]
①イベントハンドラ追加
②イベント実行用の関数を定義 (On~関数を定義)
※On~という関数でラップしているけど、文法的にはなくてもよいが、普通は作るとのこと。
③イベントを発生させる。(On~関数を呼ぶ)
⑥だめおにイベントを受け取らせるための準備

[平社員側]
④受け取るイベントと受け取ったときに呼ばれる関数をひもづける

※-=にするとイベントを受け取らないようになる。
⑤イベント発生時に実施する処理を定義
    class Program
    {
        static void Main(string[] args)
        {

            Kacho kousaku = new Kacho();
            kousaku.Work();

            Console.ReadLine();
        }
    }

    class Kacho
    {
        // 部下を加える
        Hira dameo = new Hira();

        //(1)イベントハンドラ追加 (発行する人が定義する)
        public event EventHandler DenwaEnd;          // 電話が終わった

        //(2)イベント実行用の関数を定義  (発行する人が定義する)
        private void OnDenwaEnd(EventArgs e)
        {
            if (DenwaEnd != null)
            {
                DenwaEnd(this, e);
            }
        }

        public Kacho()
        {
            //(6)だめおにイベントを受け取らせるための準備
            dameo.Subscribe(this);
        }

        public void Work()
        {
            //課長仕事開始
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("課長電話中。");
                System.Threading.Thread.Sleep(1000);
            }

            //(3)イベントを発生させる。
            OnDenwaEnd(EventArgs.Empty);

        }
    }

    class Hira
    {
        // (4)イベントを受け取る設定をする。
        // 受け取るイベントと受け取ったときに呼ばれる関数をひもづける
        public void Subscribe(Kacho kacho)
        {
            kacho.DenwaEnd += KachoDenwaEnd;
        }

        // (5)イベント発生時に実施する処理を定義
        public void KachoDenwaEnd(object sender, EventArgs e)
        {
            Console.WriteLine("課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?");
        }
    }
出力結果
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?
参考資料
プログラミングC#
0 件のコメント:
コメントを投稿