0

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.

2
Contributors
1
Reply
4
Views
7 Years
Discussion Span
Last Post by __avd
0

Event delegate Vs Interface based event.
Event delegate is better than interface based event system. You may use static or instance method as a handler with event where as with interface - implements an interface and its methods.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.