PR

 デリゲートは,オブジェクト指向プログラミングにおいて,オブジェクトの振る舞いを別のオブジェクトに肩代わりしてもらうことです。「委譲」「委任」と呼ぶこともあります。

 デリゲートを使えば,そのオブジェクト自身に処理を実装しなくて済みます。そのため,プログラム実行時まで振る舞いを決定できない場合や,クラスの肥大化を防ぎたい場合によく使われます。

 デリゲートはクラスの中で委譲先のオブジェクトを生成してメソッドを呼び出す単純な手法で実現できますが,一般にはJavaのインタフェースやC++の純粋抽象クラスなど,委譲先のクラスでメソッドの実装を強制する仕組みを併用します。

 また,.NET Frameworkには基本型(プリミティブ型)として,任意のメソッドを指し示すdelegate型が組み込まれています。.NET Frameworkでは,このdelegate型のクラス・メンバーを「デリゲート」と呼びます。

 .NET FrameworkのデリゲートはC言語の関数ポインタとよく似ていますが,デリゲートの宣言時には,返り値の型に加え,引数の並び(シグネチャ)も併せて指定します。このため,返り値の型しか関知しない関数ポインタよりも安全に使うことができます。

 .NET Frameworkのクラスライブラリでは,イベント駆動の仕組みなどにデリゲートが使われています。例えば,コントロールの振る舞い(ボタンがクリックされたときに呼び出すメソッドなど)はアプリケーションごとに異なるので,コントロール自身には組み込めません。このため,コントロールは実行時に任意のメソッドを参照できるように,デリゲート経由でメソッドを呼び出す仕組みだけを持っています。

 アプリケーション固有の振る舞いは,アプリケーション本体にメソッドとして別途定義します。アプリケーションの実行時に,そのメソッドを参照するデリゲートのインスタンスを生成し,コントロールが持つデリゲートにこのインスタンスを登録するという形で振る舞いが決定します。