从另一个类/对象调用共享函数时引发的VB.net类事件?

时间:2013-09-02 08:35:29

标签: vb.net function events

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

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

Class DataHost

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

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

End Class

我希望程序每次调用DataHost的子/函数来访问数据库时都会询问密码。

我可以在每个函数的开头添加如果askpass()= False然后返回但在我的代码中函数超过20并且我希望有一个更智能的解决方案。

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

所有建议表示赞赏! :) 提前致谢

2 个答案:

答案 0 :(得分:1)

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

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添加处理程序。并且它将获取对此的所有调用。在这里,您将能够创建一个共享变量来跟踪发件人值。例如List(对象)。

您可以通过以下方式举办活动:

Logging.OnLogWrite(Me)

你可以随时随地收听活动:

AddHandler Logging.LogEvent, AddressOf HandleLogEvent

HandleLogEvent的代码如下所示:

Private Sub HandleLogEvent()
    MessageBox.Show("Hello.")
End Sub
例如,可以将HandleLogEvent重命名为askPassword。这意味着如果没有在OnLogWrite Sub中进行检查。然后,只要调用该事件,就会执行askPassword。希望这能以某种方式帮助你。

答案 1 :(得分: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

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

  • 根据您的需要调整它。