這兩天看到c#的委托和事件這一章,書上講得很簡單直接,但是java裡沒得委托這個概念,在網上搜尋別人寫的相關資料,感覺大多都寫得太復雜了,或者就是直接講這東西怎麼聲明,怎麼定義,怎麼實現,怎麼用。看著更暈,知道怎麼用,但是不知為何要用它,也不能夠去很好的理解它。
下面講講我個人的理解,也許不太准確,如果有理解錯誤的地方,希望看到的網友聯系本人,指正一下,互相幫助學習嘛~
委托:
當我初看到委托的時候,我直接就想到了接口,來回憶一下接口。
當我們要做什麼事的時候,我們需要某個東西,我們要求這個東西要去做一些事,但是它要具體怎樣去做我們不知道也不關心,於是我們定義一個接口,裡面全是抽象方法,用於告訴別人我們要求要做這些事。然後把接口扔給別人去具體實現。我們就只管調用接口就行了。
我理解的委托也是這樣的,好比你要給自己修一座房子,你把設計圖紙畫好,然後扔給秘書,對他說“你去找些人來,讓他們給我把房子建好。”
是不是和接口很相似啊?
但是如果你就只想讓別人幫你做一件事就行了,而且那個人還可以做很多他自己的事,只在你要求他做的時候才需要他來做,定義一個接口是不是就顯得很沒有必要了呢?
委托,是引用類型,指向方法。所以定義一個委托的時候,它看起來更像是在定義一個方法,而不同於定義一個類。
PlayMedia playmedia;
用delegate關鍵字來創建委托。
event關鍵字告訴編輯器這個委托只能夠定義該委托的類調用,並且只能被其他類分別使用用+=和-=運算符來訂閱或者取消訂閱,當然這裡也可以不要event關鍵字。
委托的實現方法要和委托具有一樣的返回類型和簽名,但是非靜態方法和靜態方法都可以。
事件:
事件其實就是委托,只不過委托可以是任何事,但是事件通常是指某些動作或者某些狀態改變之類,.net中的事件還有自己的規范。
.net中的事件處理器通常返回void類型,並且取得兩個參數,第一個參數是定義委托的那個類的實例,第二個參數是一個EventArgs(事件數據的基類)的派生類對象。
Main(= ClockA a = = Hour { ; Minute { ; Second { ; TimeInfoEventArgs( hour, minute, .Hour =.Minute =.Second = SecondChangeHandler( Thread.Sleep( System.DateTime dt = (dt.Second != (SecondChanged != SecondChanged(, .second = += TimeHasChanged( += TimeHasChanged(