デリゲート_(プログラミング)
出会い最短記録!!
B分で即アポHも可

[Wikipedia|▼Menu]

デリゲート(delegate、デレゲート)とは、Objective-CC#Visual Basic .NETなどのプログラミング言語で取り入れられた機能。

他の言語で言う所の関数ポインタに近い機能であり、タイプセーフであるという特徴がある。 主にイベント処理での活用を想定している。Javaなどでのインタフェースを利用したイベント処理と比べ、メソッド名を自由に宣言できたり、イベントハンドラとして新たにわざわざクラスを書かなくてよいなどの利点がある。C#では複数のデリゲートを結合させることもでき、結合されたデリゲートを保持・呼び出すための機構としてeventメンバが用意されている。


C#でのデリゲート

C#では、次の構文によって「string型の引数を1つと、int型の戻り値を持つデリゲート」を宣言する。delegate int SomeDelegate(string p);

そして、次のようにデリゲート型オブジェクトを生成することができる。SomeDelegate del = new SomeDelegate(SomeMethod);SomeDelegate del = new SomeDelegate(delegate(string p) { return 1;});

前者の宣言では既存のSomeMethodメソッドをデリゲートの中身として指定しており、後者の宣言ではデリゲートの中身も同時に定義している(この構文では、return文によって返される値がSomeDelegateデリゲートの戻り値に暗黙的に変換できない場合、エラーとなる)。

こうして生成したデリゲート型オブジェクトは、通常のメソッドのように直接実行することができる。int ret = del("some string");

しかし、デリゲートの真価が発揮されるのはイベントと併用した時である。イベントは、次のように宣言する。event SomeDelegate SomeEvent;

こうして宣言したイベントには、+= 演算子と -= 演算子によって、デリゲート(イベントハンドラ)を追加したり削除したりすることができる。SomeEvent += new SomeDelegate(SomeEventHandler1);SomeEvent -= new SomeDelegate(SomeEventHandler1);

イベントハンドラの追加が += 演算子によって行われることから推測できるように、1つのイベントには複数のイベントハンドラを登録することができる。

次のようにしてイベントを起こすと、登録したイベントハンドラがまとめて実行される。if (SomeEvent != null) SomeEvent("some string");

実行される順番は登録順とは関係なく、未定義である。


Objective-Cのデリゲート

delegateとは「委譲」という意味であり、あるオブジェクトに代わって別のオブジェクトがメッセージの処理を引き受ける。デリゲート先のオブジェクトはどんなオブジェクトでも構わない。デリゲートしないときはnilを指定してもよい。Objective-CC++とは異なり実行時解決を採用しているので、デリゲート先に指定したオブジェクトが必要なメソッドを持っていなくてもコンパイルエラーにはならず、単に何も実行されないだけである。

あるオブジェクトAがメインウィンドウを持っていて、そのAにメインウィンドウの処理を委譲する場合[mainWindow setDelegate: self];

selfとは自分自身を指すポインタでC++で言えばthisに相当する。[ ]内はC言語に対してObjective-Cで拡張された文法で、インスタンス変数mainWindowに対してsetDelegateメソッドを送っている。C++風に書くならmainWindow.setDelegate(this);

となる。

このdelegateを設定することで、Aがメインウィンドウの処理、たとえばウィンドウを閉じる前に何かしたい場合に用いるメソッドwindowWillCloseをかわりに実行するようになる。Aに-(void)windowWillClose:(NSNotification*)notification{    // 処理}

のようなメソッドを用意しておけば、ウィンドウのクラス(NSWindow)に修正を加えたり、NSWindowを継承したクラスを作らなくても振る舞いをカスタマイズすることができる。


関連項目

委譲
カテゴリ: プログラミング言語の構文

更新日時:2008年5月7日(水)22:38
取得日時:2008/08/19 03:57


★制服でHなバイト★
1日5万円★日払い★

[オプション/リンク一覧]
[記事の検索]
[おまかせ表示]
[トップページ]
[ニュースをチェック!]
[列車運行情報]
Size:4706 Bytes
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:Mamenoki