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 を使用して新しいデリゲート・クラスを宣言するサンプル・プログラムが用意されており、静的またはインスタンス・メソッド実装のいずれかを使用してデリゲートを呼び出す方法が実証されています。これは有用ですが、デリゲート・パターンは、あるソフトウェア・コンポーネントでデリゲートの定義が提供され、フォームのボタンをクリックすると実行されるメソッドなどの実装は別のコンポーネントで提供されるようなクライアント/サーバで使用される場合が多いことに注意してください。