イベントソース
イベントソース.各種イベントのソース(発生源)の実装を支援するためのテンプレートであり, イベントを型引数としている.EventListener と組で Java のイベントモデル java.util.EventObject / java.util.EventListener をサポートする.
C++ では多重継承を用いることができるため,イベントソース側 にも継承できるサポートクラスとしてこのクラスを用意した. (java.beans.PropertyChangesSupportを参照)
登録されたリスナへの通知の順序は規定されていない.
登録された Listener の delete(デストラクタ呼び出し) については, 基本的にはアプリケーションの責任とするが,明示的に destroyListeners を 呼ぶことで全 Listener に対して delete を呼び出すことができる.
Event, Listener, Source の使用例を示す.
* * // アプリケーション定義のイベント型 * class XxxEvent { * TJEventSource<XxxEvent>* source; * int value; * public: * XxxEvent(TJEventSource<XxxEvent>* s, int v): * source(s), value(v) { } * TJEventSource<XxxEvent>* getSource() const { * return source; * } * int getValue() const { return value; } * }; * * // アプリケーション定義のイベントリスナ * #include "TJEventListener.h" * class XxxListener : public TJEventListener<XxxEvent> { * public: * virtual void eventHappened(const XxxEvent& ev) { * cout << "ev.value=" << ev.getValue() << endl; * // マルチスレッド環境では this オブジェクトの操作は危険 * } * }; * * // アプリケーション定義のイベントソース * #include "TJEventSource.h" * class XxxSource : public TJEventSource<XxxEvent> { * public: * void foo() { * // ........ * // イベント発生 * XxxEvent ev(this, 2); * fireEvent(ev); // eventHappened を呼び出す * } * }; * * // ソースとリスナの連結 * XxxSource source; * XxxListener listener; * source.addListener(&listener); * *Listener, Source の呼び出し関係は以下のようになる.
* * XxxSource XxxListener * method() | | * ---------> | | * |--+ | * | |fireEvent() | * |<-+ | * | | * | eventHappend() | * |-------------------------------->| * | | * *[ロック方針]
このクラスは,マルチスレッドに関するロックを全く意識しない. 必要であれば TJEventSource を見よ.
基本的に Listener の delete はアプリケーションの責任とするが,
アプリケーションが Listener 列の管理をしたくない場合,このメソッド
が delete を支援する.
Listener が自動変数の場合は,当然これを使用してはならない.
vector <ListenerType*> listeners
virtual ~TJEventSource()
virtual void addEventListener(ListenerType* l)
virtual void removeEventListener(ListenerType* l)
virtual void removeEventListeners()
virtual bool hasEventListener(const ListenerType* l) const
virtual void destroyEventListeners() const
virtual unsigned countEventListeners() const
virtual void fireEvent(const EventType& ev)
索引(アルファベット順) HTMLクラス継承 または Java