Visual Basic でなんとなくイベントとデリゲート その5。 - Address Of 'AddressOf' -
今回は「とりこびとの半分はやさしさで出来ています・・・が、もう半分は!!?」を予定していましたが、変更してお送りします。
前回はコメント欄でシャノンさんにAddressOfの歴史を知ることができるエントリに仕上げていただきました。ありがとうございます。
今回はデリゲートでいろいろ遊んでみます。まずは・・・あ!前回までは共有メソッド(Shared)をデリゲートに突っ込んでいましたが、インスタンス メソッドはどうなのかな?
ってことで、まずはこんなクラスを用意。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class Messenger
Private phrase As String = String.Empty
Public Sub SetPhrase(ByVal phrase As String)
Me.phrase = phrase
End Sub
Public Sub ShowMessage(ByVal targetName As String)
Console.WriteLine(phrase, targetName)
End Sub
End Class
このクラスを普通に使うとこんな感じ↓です。メッセージのフレーズを設定して、メッセージを標準出力に表示するって感じですね。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class Program
Public Shared Sub Main()
Dim bufferinMessenger As New Messenger
bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")
bufferinMessenger.ShowMessage("とりこびっち")
End Sub
End Class
で、前回までに使用していた ShowMessageDelegate を用意して・・・デリゲート経由な感じで書くと、
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)
Public Class Program
Public Shared Sub Main()
Dim bufferinMessenger As New Messenger
bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")
Dim showBufferinMessage As ShowMessageDelegate
showBufferinMessage = AddressOf bufferinMessenger.ShowMessage
showBufferinMessage.Invoke("とりこびっち")
End Sub
End Class
こんな感じになります。実行したときの出力は、
とりこびっち の半分はやさしさで出来ています。
ですね。んで、これだけだとアレなので、bufferinMessengerに加えて、もう一つMessengerを増やしてみる。
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)
Public Class Program
Public Shared Sub Main()
Dim bufferinMessenger As New Messenger
bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")
Dim showBufferinMessage As ShowMessageDelegate
showBufferinMessage = AddressOf bufferinMessenger.ShowMessage
showBufferinMessage.Invoke("とりこびっち")
Dim jojoMessenger As New Messenger
jojoMessenger.SetPhrase("さすが{0}! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!")
Dim showJoJoMessage As ShowMessageDelegate
showJoJoMessage = AddressOf jojoMessenger.ShowMessage
showJoJoMessage.Invoke("ぽぴ王子さん")
End Sub
End Class
実行したときの出力は、
とりこびっち の半分はやさしさで出来ています。
さすがぽぴ王子さん! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!
となります。要するにデリゲートにはどのインスタンスのメソッドへの参照かってのが渡されているってことでしょうか。うむ、また一つ勉強になった。
デリゲートって面白!
って、なってきました。2ヶ月くらい悩む覚悟でやってますから、気が楽ですよ、私は♪
次回ももう少しデリゲートにさわさわさわさわです。