【问题标题】:Overload VB.NET event?重载 VB.NET 事件?
【发布时间】:2014-06-06 14:30:36
【问题描述】:

在我的 VB.NET 类中,我有一些这样的代码:

Public Class barClass

Private Function foo(data as string)
    msgbox("Data is a string: " & data)
End Function

Private Function foo(data as integer)
    msgbox("Data is an integer: " & data
End Function

End Class

这显然可以让您传递foo 一个字符串或整数。

我想我可以为事件做同样的事情,所以我尝试:

Public Event FooRaised(data as string)
Public Event FooRaised(data as integer)

我认为这会让我通过传递我从 foo 获得的任何数据来引发事件,但我收到一个错误,说我不能这样做(FooRaised 已经被声明)。

我如何做到这一点?

【问题讨论】:

  • 此类事件的处理程序如何工作?
  • 你不能重载事件——就这么简单。
  • 事件有一个特定的声明,你不能随随便便地发明新的。
  • 事件通常被设计成对正在发生的事情不那么模棱两可。最后什么都没有保存,因为某处必须使用If 来确定发生了什么。

标签: vb.net class


【解决方案1】:

使用 Object 参数声明单个事件,然后检查类型以处理它:

Public Class Form1

  Public Event Foo(o As Object)

  Sub FooHandler(o As Object) Handles Me.Foo
    If o.GetType Is GetType(Integer) Then
      Dim i As Integer = DirectCast(o, Integer)
      i += 1 'add one to the integer value'
      MsgBox(i.ToString)
    ElseIf o.GetType Is GetType(String) Then
      Dim s As String = DirectCast(o, String)
      s &= "!!" 'append exclamation marks'
      MsgBox(s)
    End If
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    RaiseEvent Foo(21)
    RaiseEvent Foo("a string value")
  End Sub
End Class

【讨论】:

  • 如果不是很明显,我加了一个并附加了感叹号,以说明如何将Object转换回原始变量类型并使用该变量。
  • 一个对象类型的子是我接下来要去的地方,但我不确定是否有更好的方法去做。感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多