3

当您从另一个对象或类调用共享子/函数时,如何创建或使用引发的事件?

我将展示一个示例:我有访问数据库的 DataHost 类:

Class DataHost

Shared Sub addName().....
Shared Sub delName().....
Shared Function getNames()....

Shared Function askPassword()........

End Class

我希望程序在每次另一个类调用 DataHost 的子程序/函数来访问数据库时询问密码。

我可以在每个函数的开头添加,if askpass()=False Then return但在我的代码中,函数超过 20 个,我希望有一个更智能的解决方案。

所以我正在寻找askPassword()每当你调用另一个子/函数时调用的东西。

4

2 回答 2

5

好吧,这可能根本不是您所要求的,但是我将发布共享事件的代码,然后您可以查看是否可以以任何方式使用它。(这是我的日志事件,所以请忽略命名)

Public Class Logging
    Public Shared Event LogEvent As EventHandler
    Public Shared Sub OnLogWrite(ByVal Sender As Object)
        RaiseEvent LogEvent(Sender, New EventArgs)
    End Sub
End Class

这是您必须收听的共享事件。您可以在任何地方向 LogEvent 添加处理程序。它将获取对此的所有调用。在这里,您将能够创建一个跟踪 Sender 值的共享变量。例如一个列表(对象)。

您可以在任何地方引发事件(除了在Shared方法或函数内,因为没有实例):

Logging.OnLogWrite(Me)

您可以通过以下方式在任何地方收听活动:

AddHandler Logging.LogEvent, AddressOf HandleLogEvent

HandleLogEvent 的代码如下所示:

Private Sub HandleLogEvent()
    MessageBox.Show("Hello.")
End Sub

例如,可以将 HandleLogEvent 重命名为 askPassword。这意味着如果没有在 OnLogWrite Sub 中进行检查。然后任何时候调用事件,askPassword 都会被执行。希望这对您有所帮助。

于 2013-09-03T08:46:33.047 回答
0

我建议不要对所有函数使用共享方法,只允许通过实例调用它们。然后限制实例化(构造函数)过程。快速示例:

Class DataHost
    Shared Function GetHost() As DataHost
        If askPassword() Then
            Return New DataHost()
        End If

        ' Or do something else instead of throw nothing
        Return Nothing
    End Function

    Shared Function askPassword() As Boolean
        ' ask for password?
    End Function

    ''' <summary>
    ''' Private constructor to avoid external instantiation - thus force external calls to go through factory: GetHost()
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub New()
    End Sub

    Sub addName()

    End Sub


    Sub delName()

    End Sub

    Function getNames() As IEnumerable(Of String)

    End Function

End Class

在这里你可以看到调用GetNames(),调用者必须有一个DataHost的实例,然而,由于私有构造函数,调用者必须通过工厂方法GetHost()来获取DataHost的一个实例。

如果您不想拥有多个 DataHost 副本,您也可以使用单例,并在提供密码时在 GetHost() 方法中将其返回。

编辑:如果你真的想在这个过程中引发一个事件,你也可以在 GetHost 方法中这样做:在 DataHost 中创建一个私有方法来引发一个事件,然后在实例化 DataHost 之后,调用它来抛出事件:

    Shared Function GetHost() As DataHost
        If askPassword() Then
            dim host = New DataHost()
            host.RaiseSomeEvent() 
        End If

        ' Or do something else instead of throw nothing
        Return Nothing
    End Function

然后可以在外部订阅和处理事件。

  • 根据您的需要进行调整。
于 2013-09-02T09:20:43.440 回答