Loading [MathJax]/extensions/tex2jax.js

2012年12月7日金曜日

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

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

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

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

※-=にするとイベントを受け取らないようになる。
⑤イベント発生時に実施する処理を定義
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.   
  6.         Kacho kousaku = new Kacho();  
  7.         kousaku.Work();  
  8.   
  9.         Console.ReadLine();  
  10.     }  
  11. }  
  12.   
  13. class Kacho  
  14. {  
  15.     // 部下を加える  
  16.     Hira dameo = new Hira();  
  17.   
  18.     //(1)イベントハンドラ追加 (発行する人が定義する)  
  19.     public event EventHandler DenwaEnd;          // 電話が終わった  
  20.   
  21.     //(2)イベント実行用の関数を定義  (発行する人が定義する)  
  22.     private void OnDenwaEnd(EventArgs e)  
  23.     {  
  24.         if (DenwaEnd != null)  
  25.         {  
  26.             DenwaEnd(this, e);  
  27.         }  
  28.     }  
  29.   
  30.     public Kacho()  
  31.     {  
  32.         //(6)だめおにイベントを受け取らせるための準備  
  33.         dameo.Subscribe(this);  
  34.     }  
  35.   
  36.     public void Work()  
  37.     {  
  38.         //課長仕事開始  
  39.         for (int i = 0; i < 10; i++)  
  40.         {  
  41.             Console.WriteLine("課長電話中。");  
  42.             System.Threading.Thread.Sleep(1000);  
  43.         }  
  44.   
  45.         //(3)イベントを発生させる。  
  46.         OnDenwaEnd(EventArgs.Empty);  
  47.   
  48.     }  
  49. }  
  50.   
  51. class Hira  
  52. {  
  53.     // (4)イベントを受け取る設定をする。  
  54.     // 受け取るイベントと受け取ったときに呼ばれる関数をひもづける  
  55.     public void Subscribe(Kacho kacho)  
  56.     {  
  57.         kacho.DenwaEnd += KachoDenwaEnd;  
  58.     }  
  59.   
  60.     // (5)イベント発生時に実施する処理を定義  
  61.     public void KachoDenwaEnd(object sender, EventArgs e)  
  62.     {  
  63.         Console.WriteLine("課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?");  
  64.     }  
  65. }  
出力結果
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?
参考資料
プログラミングC#
0 件のコメント:
コメントを投稿