■33433 / inTopicNo.1) |
VB2005でマルチキャストデリゲート |
□投稿者/ たっぽ (1回)-(2009/02/27(Fri) 21:17:06)
|
分類:[VB.NET/VB2005 以降]
開発環境:Microsoft Visual Studio 2005
Professional Edition
開発言語:VB.NET
OS :WnidowsXP SP2
マルチキャストデリゲートについて調べていまして、VB.NETでの解説見つからなかった為、
http://www.atmarkit.co.jp/fdotnet/onepoint/onepoint03/onepoint03_03.html
にある"デリゲートのマルチキャスト機能を使用したサンプル・プログラム"をVB.NETにして
動作を確認しようと考え、下記のコードを作成しました。
(そのままでもええやん、等はご勘弁を…C#は"なんとなく読める"程度なので頭の中を整理
する意味も含めてVB.NETにしたかったんです。)
'************************コードここから*********************************
'C#コードを見る限り、コンソールアプリっぽいので
'App.Mainをここに記述
Module Module1
Sub Main()
Dim callable As New Callable()
Dim caller As New Caller()
caller.ShowMessage = AddressOf callable.ConcreteShowMessage
Dim fancy As New Fancy()
AddHandler caller.ShowMessage, AddressOf fancy.ShowFancyMessage
~~~~~~~~~~~@
caller.CallDelegate()
End Sub
End Module
Delegate Sub ShowMessageDelegate(ByVal msg As String)
Class Callable
Friend Sub ConcreteShowMessage(ByVal msg As String)
Console.WriteLine(msg)
End Sub
End Class
Class Caller
Friend ShowMessage As ShowMessageDelegate
Friend Sub CallDelegate()
ShowMessage("hello, from delegate!")
End Sub
End Class
Class Fancy
Friend Sub ShowFancyMessage(ByVal msg As String)
'ここでMessageBoxを使っているので
'参照にSystem.Windows.Formsを追加する必要がある。
System.Windows.Forms.MessageBox.Show(msg)
End Sub
End Class
'************************コードここまで*********************************
このコードで@の部分が構文エラーとなり、次のようなメッセージがありました。
'ShowMessage' は 'MultiCastDelegate.Caller' のイベントではありません。
と言う事は、VB.NETではイベントで無い限りマルチキャストデリゲートが出来ない
のでしょうか?それとも、私の翻訳が間違っているのでしょうか?
出来ないなら出来ないでいいんですが…イベントとデリゲートの関係を理解する上
では、困るんでないかなぁ…と思う次第です。
(なお、当然ながら元となったコードはC#プロジェクトに貼り付けてスタートアップ
オブジェクトの変更・参照にSystem.Windows.Formsを追加で動作しました。)
なお、エラーメッセージに従ってCallerクラスのShowMessageをイベントに書き換え
るとエラーが消え、元となったC#コードと同じ動作をしました。
'************************コードここから*********************************
Module Module1
Sub Main()
Dim callable As New Callable()
Dim caller As New Caller()
'イベントは"AddHandler 〜, AddressOf 〜 " でないとダメらしい。
AddHandler caller.ShowMessage, AddressOf callable.ConcreteShowMessage
Dim fancy As New Fancy()
AddHandler caller.ShowMessage, AddressOf fancy.ShowFancyMessage
caller.CallDelegate()
End Sub
End Module
Delegate Sub ShowMessageDelegate(ByVal msg As String)
Class Callable
Friend Sub ConcreteShowMessage(ByVal msg As String)
Console.WriteLine(msg)
End Sub
End Class
Class Caller
'イベント化
Friend Event ShowMessage As ShowMessageDelegate
Friend Sub CallDelegate()
RaiseEvent ShowMessage("hello, from delegate!")
End Sub
End Class
Class Fancy
Friend Sub ShowFancyMessage(ByVal msg As String)
System.Windows.Forms.MessageBox.Show(msg)
End Sub
End Class
'************************コードここまで*********************************
やっぱり、VB.NETではマルチキャストデリゲートはイベントでしか使えないのでしょうか?
どなたか、よろしくお願いします。
|
|