Visual Basic でなんとなくイベントとデリゲート その6。 - デリゲートでちょっとだけ遊ぶ -
なんとなく
お勉強しますね。いつもどおりですよ♪と、いうわけで、今回もいろいろ遊んでみますね。前回同様、こんな↓クラスを用意しておいて
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
showBufferinMessage と showJoJoMessage をがっちゃんこしてみる。がっちゃんこするにはDelegate.Combine メソッド を使用します。
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
Dim jojoMessenger As New Messenger
jojoMessenger.SetPhrase("さすが{0}! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!")
Dim showJoJoMessage As ShowMessageDelegate
showJoJoMessage = AddressOf jojoMessenger.ShowMessage
Dim combinedDelegate As [Delegate] = [Delegate].Combine(showBufferinMessage, showJoJoMessage)
combinedDelegate.DynamicInvoke("επιστημηさん")
End Sub
End Class
出力結果は
επιστημηさん の半分はやさしさで出来ています。
さすがεπιστημηさん! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!
Delegate はがっちゃんこできますよ~と。
Delegate.DynamicInvoke メソッドは、MSDNによると
現在のデリゲートが表すメソッドを動的に呼び出します (遅延バインディング)。
らしいです。ふむ、遅延バインディング、遅延バインディングねぇ。遅延バインディングがなんかヤダって人はキャストしてしまいましょう♪
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
Dim jojoMessenger As New Messenger
jojoMessenger.SetPhrase("さすが{0}! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!")
Dim showJoJoMessage As ShowMessageDelegate
showJoJoMessage = AddressOf jojoMessenger.ShowMessage
Dim combinedDelegate As [Delegate] = [Delegate].Combine(showBufferinMessage, showJoJoMessage)
Dim showMessages As ShowMessageDelegate = DirectCast(combinedDelegate, ShowMessageDelegate)
showMessages.Invoke("επιστημηさん")
End Sub
End Class
出力結果は
επιστημηさん の半分はやさしさで出来ています。
さすがεπιστημηさん! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!
ですね。
どうやらデリゲートは内部にメソッドの呼び出しリストのようなものを持っている雰囲気ですね。今回まで デリゲートで色々遊んでみました。Visual Basic でのデリゲートは Delegate ステートメントによって記述できると言うことは分かりました。で、これって結局なんなの?気になりませんか?私は気になります。
ぢゃ、調べたらいいぢゃん・・・
ですよね♪