delegate-id MsgArrivedEventHandler. procedure division using by value msg as string. end delegate. class-id a. 01 MsgArrivedEvent type "MsgArrivedEventHandler" event static. *> デリゲートは、COBOL のイベントで使用する必要がある method-id main static. set MsgArrivedEvent to type Delegate::Combine ( MsgArrivedEvent, new MsgArrivedEventHandler (self::My_MsgArrivedEventCallback) ) as type MsgArrivedEventHandler invoke MsgArrivedEvent::Invoke("Test message") *> オブジェクトが null の場合、例外をスローする set MsgArrivedEvent to type Delegate::Remove ( MsgArrivedEvent, new MsgArrivedEventHandler (self::My_MsgArrivedEventCallback) ) as type MsgArrivedEventHandler invoke self::add_MsgArrivedEvent ( new MsgArrivedEventHandler (self::My_MsgArrivedEventCallback) ) invoke MsgArrivedEvent::Invoke("Test message 2") *> オブジェクトが null の場合、例外をスローする end method. method-id My_MsgArrivedEventCallback static. procedure division using by value str as string. display str end method. end class.
デリゲート システムは、プロシージャ ポインターのオブジェクト指向に相当し、タイプ セーフなソリューションになります。プロシージャ ポインターまたは関数ポインターの使用は、多くの言語でかなり一般的なオカレンスです。.NET では、通常、あるソフトウェア コンポーネントのメカニズムとして使用され、発生したイベントを別のコンポーネントに知らせます。
COBOL でデリゲートを使用するには、次のように、宣言、インスタンス化、最終呼び出しが必要になります。
デリゲートを宣言するには、メソッド名とその署名を宣言する必要があります。COBOL でこれを行うには、デリゲートを表す専用のクラスを単一メソッドで定義します。デリゲートの宣言はクラスとかなり似ていますが、DELEGATE-ID キーワードを使用して宣言されます。
既存のデリゲート (フレームワークで定義される System.EventHandler など) を利用するには、デリゲートと同じ署名でメソッド実装を提供する必要があります。次に、メソッドをパラメーターとしてコンストラクタに提供することで、デリゲート クラスの新しいインスタンスをインスタンス化できます。このメソッドがクラスの静的またはインスタンス メンバーのどちらであるかに応じて、次に指定するようにコンストラクタでのこのパラメーターの指定方法が決まります。
Static method: class name::MethodName Instance method: object reference::MethodName
DELEGATE-ID を宣言する場合、コンパイラは、System.MulticastDelegate クラスから継承するクラスを作成します。すべてのデリゲートには 'Invoke' という名前のメソッドがあり、その署名は、DELEGATE-ID 宣言のメソッドの署名と一致します。したがって、デリゲート インスタンスに対するオブジェクト参照を保持する場合、デリゲートの構築時に提供されたメソッドの実装を実際に呼び出す INVOKE メソッドをこのオブジェクトで使用できます。
DELEGATE-ID を使用して新しいデリゲート クラスを宣言するサンプル プログラムが用意されており、静的またはインスタンス メソッド実装のいずれかを使用してデリゲートを呼び出す方法が実証されています。これは有用ですが、デリゲート パターンは、あるソフトウェア コンポーネントでデリゲートの定義が提供され、フォームのボタンをクリックすると実行されるメソッドなどの実装は別のコンポーネントで提供されるようなクライアント/サーバーで使用される場合が多いことに注意してください。