事件是觀察者模式的一種實現,事件來源定義事件,監聽者訂閱事件,在事件觸發時事件來源通知監聽者,並執行監聽者定義的處理常式,這樣事件的發生和處理分離.
C#為了實現事件模型,增加了一個類型delegate(委託),事件來源用event關鍵字定義事件,監聽者通過+=,-=來訂閱或取消訂閱事件,訂閱的過程實際上是在事件上增加處理函數的入口地址,這樣當事件發生時,事件來源就會自動調用這些處理函數.
早在VJ++時代,Anders就在Java上增加了delegate,這激怒了Sun,引發了一場論戰,Sun給delegate下了幾宗罪,比如,增加了語言的複雜度(因為多了幾個關鍵字),破壞了OO(因為delegate是二等公民,不支援繼承),對Java語言本身是有害的.
有興趣可以Sun的白皮書:
About Microsoft's "Delegates"
MS也不會輕易就速手就擒,下面是MS的反擊:
The Truth About Delegates
Java通過內聯類(Inner Class)來實現事件模型.
這其實反應了C#之父和Java創始人不同的觀念,感覺Anders是實用主義者,而Gosling是完美或者純粹主義者,C#比Java多了很多特性,比如屬性,枚舉,委託.這些Gosling都考慮過,但他覺得只要class這個關鍵字可以實現的都應該用class實現,增加一些關鍵字會增加語言的複雜度,並且會給程式員的選擇帶來麻煩.不過做為Anders的Fans,俺當然更喜歡C# style.
好像跑題了......
X++沒辦法實現C#和Java的事件模型,因為它既沒有C#的委託,也沒有Java中的內聯類.所以它的事件只能依託於運行時調用固定的方法,而這些事件都是Form,Report,DataSource等固定的元素上實現的,可以調用的方法就那麼幾個,沒辦法擴充,惟一能做的事情是重載父類的方法,實現自己的邏輯,想在自己定義的類上實現事件是沒辦法的.不過到目前為止,感覺X++的這些事件對於ERP軟體來說也夠用了,實在不行調用C#寫的Assembly就行了.