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 に追加できます。そして、これへのすべての呼び出しをフェッチします。ここで、送信者の値を追跡する共有変数を作成できます。たとえば、List(of Object)。

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 に答える