ベースクラス、ベースを継承するミドルクラス、ミドルクラスを継承するトップクラスがあります。基本クラスでイベントを定義し、メソッドから発生させました。ベース クラス イベントのミドル クラスにハンドラーを定義し、トップ クラスにも同じハンドラーを定義しました。イベントが発生すると、中間クラスのハンドラーが最初にヒットし、次にトップ クラスのハンドラーがヒットします。
チェーンにさらにクラスを追加し続けると (ultra は top から継承し、supreme は ultra から継承するなど)、イベント ハンドラーは最も基本的なクラス (たとえば、middle、top、ultra、supreme) で最初に呼び出され続けます。
この順序は常に成り立ちますか? そうでない場合、何が別の順序で進む可能性がありますか?
私が観察している順序は、この関数に完全に適合しています。一貫して機能することを確認したいだけです。
イベントが任意の順序で発生することが保証されていないことは理解していますが、これはフレームワークがコンパイル時に知っていることであり、コードの作成者として、このイベントの実行時にデリゲートの追加/削除はないと言えます。イベントはベース外で消費され、サブクラス チェーンです。実際、それは保護されています。
舞台裏で何が起こっているのかはわかりませんが、コンパイル中にシーケンスが設定されるため、実行時にそれが完了したことになるのでしょうか?
編集:私がやっていることを明確にするためにサンプルを追加しています。
Public Class BaseClass
Protected Event Hello(ByRef Cancel As Boolean)
Public Sub SayHello()
Dim Cancel As Boolean
RaiseEvent Hello(Cancel)
End Sub
End Class
Public Class MiddleClass
Inherits BaseClass
Private Sub MiddleClass_Hello(ByRef Cancel As Boolean) Handles Me.Hello
'This appears to always get called first
End Sub
End Class
Public Class TopClass
Inherits MiddleClass
Private Sub TopClass_Hello(ByRef Cancel As Boolean) Handles Me.Hello
'This appears to always get called second
End Sub
End Class
Public Class UltraClass
Inherits TopClass
Private Sub UltraClass_Hello(ByRef Cancel As Boolean) Handles Me.Hello
'This appears to always get called third
End Sub
End Class
'...and so on