デリゲート

デリゲート・システムは、プロシージャ・ポインタのオブジェクト指向に相当し、タイプ・セーフなソリューションになります。プロシージャ・ポインタまたは関数ポインタの使用は、多くの言語でかなり一般的なオカレンスです。.NET では、通常、あるソフトウェア・コンポーネントのメカニズムとして使用され、発生したイベントを別のコンポーネントに知らせます。
注:この機能は .NET の COBOL でのみサポートされます。

コンテキスト:

    プログラムの構造
        タイプ

delegate-specification

delegate-header procedure-division-header

delegate-header

access-modifier attribute-clause

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