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 メソッドを # オーバーライドすれば、クリック時の処理を再定義することはできます。 
 
  |  
  |