よっつめのDelegate。

委譲先メソッドは複数指定することもできるのですよっと。ふむふむ。


[Visual Basic]

Imports System


Public NotInheritable Class Program


' えんとりぽいんとぉ〜!
Public Shared Sub Main(ByVal args As String())

Dim bufferinMessenger As New Messenger
bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")

Dim caesarMessenger As New Messenger
caesarMessenger.SetPhrase("{0} 、お前もか!")

' それぞれのインスタンスのメソッドをデリゲートに入れる。
Dim bufferinMethod As New ShowMessageDelegate(AddressOf bufferinMessenger.ShowMessage)
Dim caesarMethod As New ShowMessageDelegate(AddressOf caesarMessenger.ShowMessage)

' デリゲートを合成した新しいデリゲートを作成。
Dim methods As ShowMessageDelegate = CType(System.Delegate.Combine(bufferinMethod, caesarMethod), ShowMessageDelegate)

' 呼びだしメソッドの呼びだし(ややこしいわ!)
Program.ShowMessage(args(0), methods)

End Sub


' 引数にあるメソッドで実際に実行するメソッド
Private Shared Sub ShowMessage(ByVal targetName As String, ByVal method As ShowMessageDelegate)

method(targetName)

End Sub


' メッセージを表示する Delegate
Private Delegate Sub ShowMessageDelegate(ByVal targetName As String)


End Class


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