Re: コールバック関数 ( No.2 ) |
- 日時: 2010/05/26 09:20
- 名前: 魔界の仮面弁士
- 【この文を削除しないで投稿して下さい】
> VBについての質問ではないのでこちらに投稿しました。 VB.NET 掲示板で良いと思います。
> デリゲードについて勉強してるんですが デリゲードではなく、 デリゲートですよね。(Delegate)
> デリゲードってコールバック関数の事だと知りました。 一つのデリゲート インスタンスに複数の関数呼び出しを登録することもできますし、 関数だけではなく戻り値の無いメソッドも扱えますので、厳密には同じものでは ありませんが…端的にはコールバック関数のようなものと言えるかも知れませんね。
> 忙しい人が、"これやっておいて"と頼む状況だと思うのですが そういう使い方もできますが、処理ロジックを外注する際にも使われます。
.NET で言えば、Array.Find(Of T) メソッドに使われる Predicate(Of T) デリゲートや、 Array.ForEach(Of T) メソッドに使われる Action(Of T) デリゲートなどの利用パターンです。
Dim a() As Object = {123, Now, "test"} Array.ForEach(a, AddressOf MsgBox)
配列の内容をどのように検索するか、個々のメンバをどのように処理するのかは Array クラス側では事前に定義できません。そのため、処理内容をデリゲートを通じて 外部から指定してもらうという形になっています。
そして、これを発展させたものが、いわゆる「イベント」です。 代表的なのは、Click イベントなどに利用される EventHandler デリゲートですね。
たとえば Button クラスは、クリック時に何かの処理を行わせるためのコントロールですよね。 しかしその処理内容がどういう物であるかを、Button クラス自身は知りません。 処理内容を知っているのは、ボタンを使う側(一般的には Form)です。
そこで、Click イベント(として登録される EventHandler デリゲート)を通じて Button を利用する側に、その処理内容を提示してもらう形をとっています。
# なおイベントやデリゲートを使わずとも、Button を継承して OnClick メソッドを # オーバーライドすれば、クリック時の処理を再定義することはできます。
|
|