ちょっと電卓祭他で間が空きましたが、このシリーズ再開します。
さて、前回に引き続き今回はその4とその5でやった「Observerパターン」のコードをVBに直してみました。
まずは「その4」でやった、普通にInterfaceを用いたObserverパターン。
Public Interface IObserver
Sub Notify(ByVal fromAddress As String _
, ByVal toAddress As String, ByVal subject As String)
End Interface
Public Interface ISubject
Sub RegisterObserver(ByVal observer As IObserver)
Sub RemoveObserver(ByVal observer As IObserver)
Sub NotifyObserver()
End Interface
Public Class MailManager
Implements ISubject
Private _observerList As List(Of IObserver)
Private _fromAddress As String
Private _toAddress As String
Private _subject As String
Public Sub New()
_observerList = New List(Of IObserver)()
End Sub
Public Sub RegisterObserver(ByVal observer As IObserver) _
Implements ISubject.RegisterObserver
_observerList.Add(observer)
End Sub
Public Sub RemoveObserver(ByVal observer As IObserver) _
Implements ISubject.RemoveObserver
_observerList.Remove(observer)
End Sub
Public Sub NotifyObserver() Implements ISubject.NotifyObserver
For Each observer As IObserver In _observerList
observer.Notify(_fromAddress, _toAddress, _subject)
Next
End Sub
Public Sub SetData(ByVal fromAddress As String _
, ByVal toAddress As String, ByVal subject As String)
_fromAddress = fromAddress
_toAddress = toAddress
_subject = subject
NotifyObserver()
End Sub
End Class
Public Class Fax
Implements IObserver
Public Sub Notify(ByVal fromAddress As String _
, ByVal toAddress As String, ByVal subject As String) _
Implements IObserver.Notify
Console.WriteLine("Faxを送信します。")
Console.WriteLine("From:{0}, To:{1}, Subject:{2}" _
, fromAddress, toAddress, subject)
End Sub
End Class
Public Class Printer
Implements IObserver
Public Sub Notify(ByVal fromAddress As String _
, ByVal toAddress As String, ByVal subject As String) _
Implements IObserver.Notify
Console.WriteLine("印刷します。")
Console.WriteLine("From:{0}, To:{1}, Subject:{2}" _
, fromAddress, toAddress, subject)
End Sub
End Class
Public Shared Sub Main(ByVal args As String())
Dim mm As New MailManager()
Dim fax As New Fax()
mm.RegisterObserver(fax)
Console.WriteLine("1回目")
mm.SetData("わんくま同盟", "まさる", "勉強会の連絡")
Dim printer As New Printer()
mm.RegisterObserver(printer)
Console.WriteLine("2回目")
mm.SetData("わんくま同盟", "まさる", "補足")
mm.RemoveObserver(fax)
Console.WriteLine("3回目")
mm.SetData("わんくま同盟", "まさる", "訂正")
Console.ReadLine()
End Sub
実行結果
1回目
Faxを送信します。
From:わんくま同盟, To:まさる, Subject:勉強会の連絡
2回目
Faxを送信します。
From:わんくま同盟, To:まさる, Subject:補足
印刷します。
From:わんくま同盟, To:まさる, Subject:補足
3回目
印刷します。
From:わんくま同盟, To:まさる, Subject:訂正
次に「その5」でやった、イベントを使ったObserverパターン。
Public Class NewMailEventArgs
Inherits EventArgs
Private ReadOnly _fromAddress As String
Private ReadOnly _toAddress As String
Private ReadOnly _subject As String
Public Sub New( _
ByVal fromAddress As String _
, ByVal toAddress As String _
, ByVal subject As String _
)
Me._fromAddress = fromAddress
Me._toAddress = toAddress
Me._subject = subject
End Sub
Public ReadOnly Property FromAddress() As String
Get
Return Me._fromAddress
End Get
End Property
Public ReadOnly Property ToAddress() As String
Get
Return Me._toAddress
End Get
End Property
Public ReadOnly Property Subject() As String
Get
Return Me._subject
End Get
End Property
End Class
Public Class MailManager
Public Event NewMail As EventHandler(Of NewMailEventArgs)
Private Sub Notify(ByVal e As NewMailEventArgs)
RaiseEvent NewMail(Me, e)
End Sub
Public Sub SetData( _
ByVal fromAddress As String _
, ByVal toAddress As String _
, ByVal subject As String _
)
Dim e As New NewMailEventArgs(fromAddress, toAddress, subject)
Notify(e)
End Sub
End Class
Public Class Fax
Public Shared Sub Notify(ByVal sender As Object, ByVal e As NewMailEventArgs)
Console.WriteLine("Faxを送信します。")
Console.WriteLine("From:{0}, To:{1}, Subject:{2}" _
, e.FromAddress, e.ToAddress, e.Subject)
End Sub
End Class
Public Class Printer
Public Shared Sub Notify(ByVal sender As Object, ByVal e As NewMailEventArgs)
Console.WriteLine("印刷します。")
Console.WriteLine("From:{0}, To:{1}, Subject:{2}" _
, e.FromAddress, e.ToAddress, e.Subject)
End Sub
End Class
Public Shared Sub Main(ByVal args As String())
Dim mm As New MailManager()
AddHandler mm.NewMail, AddressOf Fax.Notify
Console.WriteLine("1回目")
mm.SetData("わんくま同盟", "まさる", "勉強会の連絡")
AddHandler mm.NewMail, AddressOf Printer.Notify
Console.WriteLine("2回目")
mm.SetData("わんくま同盟", "まさる", "補足")
RemoveHandler mm.NewMail, AddressOf Fax.Notify
Console.WriteLine("3回目")
mm.SetData("わんくま同盟", "まさる", "訂正")
Console.ReadLine()
End Sub
実行結果
1回目
1回目
Faxを送信します。
From:わんくま同盟, To:まさる, Subject:勉強会の連絡
2回目
Faxを送信します。
From:わんくま同盟, To:まさる, Subject:補足
印刷します。
From:わんくま同盟, To:まさる, Subject:補足
3回目
印刷します。
From:わんくま同盟, To:まさる, Subject:訂正
いかがでしょ?Interfaceを用いたほうはあんまりC#と変わりませんね。
イベントの方は、
- MailManager.Notifyメソッド内で、C#はデリゲートをそのまま呼び出しているが、VBはRaiseEventでイベントを発生させている。
- イベントの登録がC#は+=、-=演算子で行うが、VBはAddHandler、RemoveHandler、およびAddressOfキーワードを使って行う。
といったところがC#とはちょっと違いますね。
このように、C#とVBの違いを覚えておくと、つぶしが利くようになりますので、初心者の皆様は両方でコードを書いてみることをお勧めします。
みんなで(プログラミング言語くらいは)マルチリンガルになりましょう。
#ホントは英語も覚えてバイリンガルになりたいですけど、なかなかむずかしいっすorz