2016-10-03 11 views
0

少年少年、そのタイトルは混乱しています!将来のサブからこのサブを呼び出したサブを呼び出す方法

これは例で最もよく説明されています。ここで私は何をしたいのですか?

Dim m as sub 

Public sub alg1() 
    call alg2() 
End sub 

Public sub alg2() 
    m = alg1 
    call alg3() 
End sub 

Public sub alg3() 
    call m 
End sub 

したがって、私はalg1でコードを実行し始めます。 alg1はalg2を呼び出します。これは誰が呼び出すかを書き留めています(stackTrace.GetFrame(1).GetMethod()。Name)を考えて、それをローカル変数に格納してから、alg2を呼び出してalg3を呼び出します。 alg3は、ローカル変数mに格納されているサブを呼び出します。

alg1はalg2とは異なるクラスなので、私の状況はもう少し複雑ですが、理論的には、実行時に定義されたサブクラスにクロスクラスコールを行うことだけです。このようなサブを格納する方法はありますか?

+0

Downvote最初の30秒。それは何らかの記録でなければなりません。質問を改善する方法(またはなぜそれが下落したのか)に関するアドバイスはありますか? – FraserOfSmeg

+0

代議員を見てください。 https://msdn.microsoft.com/en-us/library/ms172880.aspxおよびhttps://msdn.microsoft.com/en-us/library/5t38cb9x.aspx – Jeremy

+0

alg1とalg2が異なるクラスにある場合、 alg3ですか?関数を知っていても、オブジェクトへの参照が必要です。これらを引数として渡すことはできますか?あなたの例では、無限ループを持ちますが、どうやってそこから抜け出しますか?あなたはイベントでこれを行い、代りに代理をしてもらえますか? –

答えて

2

あなたの例では、ActionAddressOf

Dim m As Action 

Public Sub alg1() 
    Call alg2() 
End Sub 

Public Sub alg2() 
    m = AddressOf alg1 
    Call alg3() 
End Sub 

Public Sub alg3() 
    Call m() 
End Sub 

の小さな変更で動作するはずです別のオプションは、それをパラメータとして渡すことです:内

Public Sub alg2() 
    alg3(AddressOf alg1) 
End Sub 

Public Sub alg3(m As action) 
    m() 
End Sub 
1

ここでは、上記の考え方を実行する簡単な例を示します。

簡体コンソールコード:

Public Module Module1 

    Private Delegate Sub CoolDelegate() 
    Private m As CoolDelegate 

    Public Sub Main() 
     Debug.WriteLine("Calling Alg1") 
     Alg1() 
    End Sub 

    Private Sub Alg1() 
     Debug.WriteLine("Alg1 Called") 

     Debug.WriteLine("Calling Alg2") 
     Alg2() 
    End Sub 

    Private Sub Alg2() 
     Debug.WriteLine("Alg2 Called") 

     m = New CoolDelegate(AddressOf Alg1) 
     Debug.WriteLine("Calling Alg3") 
     Alg3() 
    End Sub 

    Private Sub Alg3() 
     Debug.WriteLine("Alg3 Called") 

     Debug.WriteLine("Calling m") 
     m() 
    End Sub 
End Module 

出力:

Calling Alg1 
Alg1 Called 
Calling Alg2 
Alg2 Called 
Calling Alg3 
Alg3 Called 
Calling m 
Alg1 Called 
Calling Alg2 
Alg2 Called 
Calling Alg3 
Alg3 Called 
Calling m 
Alg1 Called 
Calling Alg2 
Alg2 Called 
Calling Alg3 
Alg3 Called 
Calling m 
Alg1 Called 
Calling Alg2 

(... ...スタックオーバーフローまで繰り返す)

また取り除くために変更することができますローカルのプライベート変数のここでは別のバージョンがある...

Public Module Module1 

    Private Delegate Sub CoolDelegate() 

    Public Sub Main() 
     Debug.WriteLine("Calling Alg1") 
     Alg1() 
    End Sub 

    Private Sub Alg1() 
     Debug.WriteLine("Alg1 Called") 

     Debug.WriteLine("Calling Alg2") 
     Alg2(AddressOf Alg1) 
    End Sub 

    Private Sub Alg2(Caller As CoolDelegate) 
     Debug.WriteLine("Alg2 Called") 

     Debug.WriteLine("Calling Alg3") 
     Alg3(Caller) 
    End Sub 

    Private Sub Alg3(Caller As CoolDelegate) 
     Debug.WriteLine("Alg3 Called") 

     Debug.WriteLine("Calling Caller") 
     Caller() 
    End Sub 
End Module 
関連する問題