Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 -
ただいまイベントとデリゲートについて勉強しています。
なんとなく (そしてそれとなく)
ですが、何か?
「勉強しながらエントリ書くんじゃなくて勉強してからエントリ書けば楽ぢゃね?」という生暖かいお言葉をいただいています。どう考えてもその通りです。本当にありがとうございました。
ちょっとイベントに関していろいろコメントやエントリをいただきまして・・・そろそろボロが出そうですので(こらw)一旦イベントから離れます。
今回は「デリゲートって何ぞや?」ってのをお勉強します。デリゲートは、ほかのオブジェクトのメソッドを呼び出すために使用できるオブジェクトらしいです。
さっぱりわかりません!!
「関数ポインタみたいなもの」?・・・あ、ああ、あれね。で、関数ポインタの何色のやつに近いと思います!?私は緑色のヤツが一番近いと思うんですけど・・・。
・・・。
関数ポインタなんてしらないよぅ。
・・・しかたない、
関数ポインタとデリゲートの話は επιστημη さんに丸投げぢゃ~!!(名指しはやめなさい。
さて、こういうさっぱりなのはとりあえず書いてみるに限ります。で、それを見て2ヶ月くらい悩めばいいんですよ。あったまいいな~♪
どうせ私なんてあんこの入ってないあんぱんですから。orz
そろそろ本題に入りましょう。準備はこちら↓
Option Compare Binary
Option Explicit On
Option Strict On
Public Class Program
Public Shared Sub Main()
Program.ShowBufferinMessage("とりこびと")
End Sub
Private Shared Sub ShowBufferinMessage(ByVal targetName As String)
Console.WriteLine("{0} の半分はやさしさで出来ています。", targetName)
End Sub
End Class
Program クラス の ShowBufferinMessage メソッドの呼び出しでメッセージを出力するだけです。今回はコイツにデリゲートを絡めてみます。
ではまず、デリゲートの宣言から。デリゲートの宣言には Delegate ステートメントを使用します。たとえば、以下のような感じで。
Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)
Visual Basic では、「デリゲートは、名前空間、モジュール、クラス、構造体レベルで宣言できますが、プロシージャ内では宣言できません。」だそうです。
見た目はSub プロシージャとあんまし変わりませんが、デリゲートの宣言です。プロシージャの宣言ではありません。
Option Compare Binary
Option Explicit On
Option Strict On
Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)
Public Class Program
Public Shared Sub Main()
Program.ShowBufferinMessage("とりこびと")
End Sub
Private Shared Sub ShowBufferinMessage(ByVal targetName As String)
Console.WriteLine("{0} の半分はやさしさで出来ています。", targetName)
End Sub
End Class
とりあえず、名前空間に宣言してみました(名前空間の記述は無いですがw)。ShowBufferinMessage メソッドと、ShowMessageDelegate のシグニチャは一致させています。
まま、どんどん行きましょう!なにせさっぱり分かりませんから。現状 直接呼び出している ShowBufferinMessage メソッドをデリゲート経由で呼び出すって感じ・・・。
Option Compare Binary
Option Explicit On
Option Strict On
Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)
Public Class Program
Public Shared Sub Main()
Dim showMessage As ShowMessageDelegate
showMessage = New ShowMessageDelegate(AddressOf Program.ShowBufferinMessage)
showMessage.Invoke("とりこびと")
End Sub
Private Shared Sub ShowBufferinMessage(ByVal targetName As String)
Console.WriteLine("{0} の半分はやさしさで出来ています。", targetName)
End Sub
End Class
・・・なんのこっちゃ?
ですよね。でもAddressOf キーワードとか、なんとなくいい感じですよね♪
ざっと読んだままと書いていきますと・・・
まず、(a) の行で ShowMessageDelegate 型の showMessageMethod という変数を宣言します。デリゲートの宣言って、シグニチャに対応した型 のデリゲートを宣言しているっぽいですね。クラスを作るのと同じ感覚かな~?コンパイラかだれかがどっかでShowMessageDelegate 型のクラスを作ってそうぽ。名前空間に直接作成できるし。
次に(b)の行で Program クラス の ShowBufferinMessage メソッド をコンストラクタに指定したShowMessageDelegate のインスタンスを作成します。単なる初期化ですよ、初期化。シグニチャが一致するやつなら指定できるのかしら?
んでもって、(c)で組み込みの Invoke メソッドを呼び出してデリゲートに関連付けられたメソッド(今回の場合は、ShowBufferinMessage メソッド)を呼び出すと。(組み込みってなんぞね?)
ふむふむ・・・要するにデリゲートってのはメソッドに対する参照を持てるクラスってことなのね?
あ、あの・・・
いまさらですけど・・・ちょっといいですか?
AddressOf キーワードってなんなのさ?
というわけ(?)で続きますです。