Hello All,
I haven't posted a question in sometime, im hoping this is where all my previous help pays off :P
Basically starting a newish project which must be written in VB.Net (great) but I am implementing the MVC pattern pretty much throughout the entire project as there is a requirement that after the initial project is done the underlying structure (model) will be replaced with one of our own building.
So having not much related to the above I have a question or i suppose more of a debate of how to implement MVC using events or interfaces. A simple example below shows what I mean.
I have a class which holds data (model)
Public Class DataClass
Private _name As String
Public Property Name() As String
Get
return Me._name
End Get
Set(ByVal value As String)
Me._name = value
End Set
End Property
End Class
My form (view) obviously updates according to the data held in this class. In this case the "Name" property. But I understand I can use any of the following two methods attach listeners using the Observer Pattern.
' ###
' Example 1: Interface (The way I would program with Java)
Public Interface IDataClassListener
Sub OnNameChange(ByVal d As DataClass)
End Interface
Public Class DataClass
' Add a list of listeners for this object
Private _listeners As New List(Of IDataClassListener)
Private _name As String
Public Property Name() As String
Get
return Me._name
End Get
Set(ByVal value As String)
Me._name = value
RaiseOnNameChange() ' Raise the event
End Set
End Property
' Method to add a listener to the object,
' there would be a remove listener method also
Public Sub AddListener(ByVal listener As IDataClassListener)
Me._listeners.Add(listener)
End Sub
' Method to raise the method on all listening objects
Private Sub RaiseOnNameChange()
For Each listener As IDataClassListener In me._listeners
listener.OnNameChange(Me)
Next
End Sub
End Class
' Then in my form I could implement the interface and
' assign it as a listener on the object
Public Class MyForm
Implements IDataClassListener
Private _data As DataClass
Public Sub New(ByVal data As DataClass)
Me._data = data
Me._data.AddListener(Me)
End Sub
Private Sub OnNameChange(ByVal d As DataClass) Implements IDataClassListener.OnNameChange
' ### Update the display on change
End Sub
End Class
' ###
' Example 2: Event Driven
Public Class DataClass
Delegate Sub OnNameChangeHandler(ByVal d As DataClass)
Public Event OnNameChange As OnNameChangeHandler
Private _name As String
Public Property Name() As String
Get
return Me._name
End Get
Set(ByVal value As String)
Me._name = value
RaiseEvent Me.OnNameChange(Me) ' Raise the event
End Set
End Property
End Class
' Different from example 1, just add a handler to the event
Public Class MyForm
Private _data As DataClass
Public Sub New(ByVal data As DataClass)
Me._data = data
Dim d As New DataClass.OnNameChangeHandler(AddressOf Me.OnNameChange)
AddHandler _data.OnNameChange, d
End Sub
Private Sub OnNameChange(ByVal d As DataClass)
' ### Update the display on change
End Sub
End Class
So ok, I realize both will work, I am more comfortable with the first pattern but is there any reason why I should be using this second way? I cant seem to find a definative answer but some (very few sources) suggest the second but with no reasoning, any help is appreciated.