【问题标题】:Add a handler of event for each class which implements the interface为每个实现接口的类添加事件处理程序
【发布时间】:2015-02-13 00:11:21
【问题描述】:

我有这门课:

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. 为实现接口的每个类添加事件处理程序的最佳方法是什么?

【问题讨论】:

    标签: .net vb.net events interface


    【解决方案1】:
    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
    

    见我在上面代码中添加的 cmets...

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

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

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

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

    编辑

    如果您尝试连接到同一个对象,您的创建就可以完成。 只需在构造函数中使用“ME”关键字即可。

    AddHandler Me.ChangeStatut, AddressOf OnChangingStatut
    

    【讨论】:

    • 感谢@DarrenMB:但我知道collegue 什么都不是(我在问题中提到了这一点),我需要知道如何在不实例化实现接口的类的情况下将处理程序添加到事件中?
    • 您不能将处理程序添加到不存在的东西。您需要对该对象的引用。
    • 我的意思是为所有实现接口的类添加一个处理程序,你的解决方案很好,但我需要一个全局的,我的意思是如果我没有完整的类列表 ({objInfoViewModel, objResultViewModel,... })
    • 更新了答案。如果您真的想要一个代码块来处理该类型的所有对象的该事件,那么您应该使事件处理程序子例程“共享”。
    • @LamloumiAfif:不可能。您将处理程序添加到对象。您必须引用该对象才能对其进行任何操作。 .NET 中没有“选择所有对象”之类的东西。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2010-12-16
      • 2011-04-05
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多