我有一個基類,一個繼承自基類的中間類和一個繼承自中間類的頂級類。我在基類中定義了一個事件並從一個方法中提取它。我在中間類中爲基類事件定義了一個處理程序,並且在頂級類中也定義了相同的處理程序。 當事件觸發時,中間類處理程序首先被擊中,然後是頂級處理程序。固定的繼承層次結構中的事件處理程序序列是否已修復?
如果我不斷向鏈中添加更多類(超級繼承頂級,超級繼承等等),事件處理程序會不斷在最基本的類中調用(例如,中,頂,超,至尊)。
這個序列總是成立嗎? 如果不是,那麼它會以不同的順序排列?
我正在觀察的順序非常適合這個功能;我只是想確保它會一直工作。
我理解事件並不保證以任何順序觸發,但這是框架在編譯時知道的事情,作爲代碼的作者,我可以說在運行時不會添加/刪除委託這個事件,事件也不會在基地之外消耗,而且是子類連鎖;事實上,它是受保護的。
我不知道幕後發生了什麼,但它可能會在編譯期間設置序列,因此在運行時它已經完成了處理?
編輯:我添加了樣本,以澄清我在做什麼。
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
如果您自己重新舉辦活動,並且沒有任何代碼可能會混淆再次提升它的方法,那麼訂單就不會受到干擾。當然,你應該使這種方法是私人的而不是保護,以獲得硬性保證。 – 2012-08-07 17:15:19
@Hans我添加了我的代碼,所以你可以看到一切的範圍。 – toddmo 2012-08-07 17:25:30