为实现接口的每个类添加事件处理程序

时间:2014-12-14 22:28:04

标签: .net vb.net events interface

我有这堂课:

Public Class Form1ViewModel

#Region "Classes collègues"
    Public objInfoViewModel As InfoViewModel
    Public objResultViewModel As ResultViewModel
#End Region

#Region "Constructor"
    Public Sub New()
        objInfoViewModel = New InfoViewModel
        objResultViewModel = New ResultViewModel
        Dim collegue As IMediatorForm1
        AddHandler collegue.ChangeStatut, AddressOf OnChangingStatut
        'AddHandler objInfoViewModel.ChangeStatut, AddressOf OnChangingStatut
    End Sub
#End Region


#Region "Methods"
    Private Sub OnChangingStatut(ByVal intAge As Integer)
        If (objResultViewModel IsNot Nothing) Then
            If (intAge > 0 AndAlso intAge < 10) Then objResultViewModel.Result = "Enfant"
            If (intAge >= 10 AndAlso intAge < 30) Then objResultViewModel.Result = "Adolescent"
            If (intAge >= 30 AndAlso intAge < 50) Then objResultViewModel.Result = "Homme"
            If (intAge >= 50) Then objResultViewModel.Result = "Vieux"
        End If
    End Sub
#End Region

End Class

InfoViewModelResultViewModel是两个实现IMediatorForm1接口的类。

当我尝试AddHandler objInfoViewModel.ChangeStatut, AddressOf OnChangingStatut时没有问题。但是我想为每个实现IMediatorForm1接口的类添加事件处理程序。

当我尝试

Dim collegue As IMediatorForm1
AddHandler collegue.ChangeStatut, AddressOf OnChangingStatut

我得到Null Exception因为对象collegue什么都没有。所以

  1. 如何修复我的代码?
  2. 为实现接口的每个类添加事件处理程序的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

Public Sub New()
    objInfoViewModel = New InfoViewModel
    objResultViewModel = New ResultViewModel
    Dim collegue As IMediatorForm1 
    ' you are note setting anything to the object reference above
    AddHandler collegue.ChangeStatut, AddressOf OnChangingStatut
    ' cannot do the above because "collegue" is NOTHING.
    'AddHandler objInfoViewModel.ChangeStatut, AddressOf OnChangingStatut
End Sub

请参阅我在上面的代码中添加的评论...

我可以提出一个解决方案,但它并不是100%清楚你想要做什么。

如果2个全局变量属于该接口类型,那么只需在AddHandler代码中直接使用它们。

或者,您可以遍历它们以添加每个...

for each obj as IMediatorForm1 in {objInfoViewModel, objResultViewModel }
    AddHandler obj.ChangeStatut, AddressOf OnChangingStatut
next

<强> 修改

如果你试图挂钩同一个对象你可以做的创建。 只需在构造函数中使用“ME”关键字。

AddHandler Me.ChangeStatut, AddressOf OnChangingStatut

答案 1 :(得分:1)

您的基础架构是否允许使用abstract class而不是IMediatorForm1接口?在这种情况下,您可以在抽象基类中实现处理程序。