Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ -
というわけで今回からイベントとデリゲートについての拙いエントリに戻ります♪
前回調べてみよ~って書いていたので(もう忘れられてますかね?w)調べました。
あくまでなんとなくですけど。
Delegate ステートメント ってなにさ?ってことだったのですが、Delegate ステートメントを使用して書かれたデリゲートはMulticastDelegate クラスを継承したデリゲート クラスとしてVisual Basic コンパイラによって作成されます。
これさえ分かっていれば、あとはMSDNを頼りになんとかなりそうですね♪
前回のエントリで書いた以下のコード、ShowMessageDelegate にキャストすることで Invoke メソッドがちゃんと String 型の引数を取れるのは Visual Basic コンパイラがそういう風に作ってくれているからなんですね♪
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 ステートメントを使用せず、MulticastDelegate クラスを直接継承したクラスを書くことをサポートしていません。といっても、今のところ、私は「作ってくれるんだからいいぢゃん♪」なんですけどね。
このあたりはMSDN:共通型システムのデリゲートに書かれています。引用すると、
すべてのデリゲートが MulticastDelegate を継承し、System.MulticastDelegate は Delegate を継承します。C#、Visual Basic、および C++ 言語はこれらの型からの継承を許可せず、代わりにデリゲートを宣言するためのキーワードを提供します。
です。(Visual Basic だけでなく、C# や C++(CLI?) もそういう仕様なんですね。)
ふむふむ・・・すべての型がMulticastDelegateを継承するということは、とあるデリゲートを継承したデリゲートなんてのも作れないのか・・・。
さて、今回は少し間が開いてしまったのでこのあたりで終わりまそ。で、デリゲートってのが、なんとなく分かってきたところで、「イベントとデリゲート」な話に戻ります~。