• ベストアンサー

,NET2003で予約後eventの疑問

こんばんは .NETで予約語eventというものがあるのですが どんな役割があるのがネットを探してもなかなかみつからない のでここで質問しました。 言語はC++です。青文字になるeventはどのような役割があるのが 説明がほしいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

event 或いは __event は Microsoft Visual C++ の独自拡張です。 従って、純粋に C++ でプログラムをする場合には、使いません。 ●キーワード __event/event .NET 2003 の時点の 1. Native C++ 拡張の __event (c.f. http://msdn.microsoft.com/ja-jp/library/ee2k0a7d.aspx ) 2. COM 拡張の __event (c.f. http://msdn.microsoft.com/ja-jp/library/hdcxwbd5.aspx ) 3. Managed C++ の __event (c.f. http://msdn.microsoft.com/en-us/library/aa712749(v=vs.71).aspx ) .NET 2005 以降の 4. C++/CLI の event (c.f. http://msdn.microsoft.com/ja-jp/library/58cwt3zh.aspx ) があって、それぞれ使い方が微妙に異なりますが、基本的な思想・目的は同じです。因みに、特に .NET Framework が関わっているのは 3. と 4. です。 (今調べて分かる範囲では event は .NET 2005 以降ですので、.NET 2003 の時点で event が青文字だったとしたら、それが実際にどの様な意味を持っていたのか、あるいは単に予約語だったのかどうかまでは分かりませんでした。) ●実体 身も蓋もない書き方をすれば、イベントの正体は「関数オブジェクトなメンバ変数」と同等な物です。しかし特に「イベント」と言う語を使う時には、ある思想・目的の元に特定の使い方をするのが普通です。 取り敢えず、目的や役割の事(後で説明)は忘れて、表面的にその使われ方を書くと: <1> 他のオブジェクトが、自由にそのイベントメンバに関数オブジェクトを代入できる。※実際は、単なる関数オブジェクトではなく関数オブジェクトの「リスト」にして、他のオブジェクトがそこに関数オブジェクトを追加したり削除したりするという形になる。 <2> イベントメンバの持ち主オブジェクトが、そのイベントに代入・登録されている関数オブジェクトを呼び出す。 ●役割 一言で言うと Observer(Listener) パターンと同じアイディアです。 http://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 イベントは特に↑を実装する為の一つの簡便な手段といえるでしょう。 じゃあ、そのパターンはどんな物かというと: * Aさんは他人に関係なくXをする。しかし、自分がXするのを待っている他人がいるかもしれない事は知っている。 * Bさんは、AさんがXした時に、Yをしたいと考えている。 この時、オブジェクトAは OnX というイベントを自分のメンバとして公開します。 <1> 他のオブジェクトBは、イベント A::OnX に自分のしたい処理 Y を登録する。 <2> Aさんは自分がXをした時に、A::OnX に登録されている処理を呼び出す。 という訳です。 具体例があった方が分かりやすいでしょう。 例えば、ボタンのクラスを設計するとします。ボタンはクリックした時に何かの操作をする為にありますが、何の操作をするかまではボタンを設計している段階では関係ありません。しかし、自分がクリックされた時に他のオブジェクトについて何か処理をするだろうという事は分かっています。そこで、ボタンに OnClick イベントを用意して、自分がクリックされた時にイベント OnClick を実行する様にします。後は、そのボタンクラスを使う側で、クリックによって引き起こされる処理 Y を、ボタンの OnClick に登録しておけば、実際にボタンがクリックされた時に OnClick を介して Y が呼び出されるという感じです。 ●C++ では 既に述べたように event は Microsoft Visual C++ における拡張である「C++/CLI 言語」のキーワードなので、純粋な C++ 言語では使えません。 しかし、純粋な C++ でも多少記述は煩雑になりますが Observer パターンを実装できますし、operator() operator+= operator-= などを overload する事によって使い方も event に似せる事が可能です。更に C++11 (C++ 2011年規格) の std::function やラムダ式を使うとより簡潔・自然に、event と同じ機能を再現できると思います。

DEADSPACE566
質問者

お礼

つまりアプリケーションでボタン操作を行う機能を実装する場合などで用いられる予約語(パターン)ということでしょうかね。 オブジェクトAの処理、OnXにオブジェクトBの処理を簡便に追加できるということですね。 とても詳細に説明してくださりありがとうございます。

関連するQ&A