.NET動靜結(jié)合編程 接口和委托的約束強度
靜態(tài)語言和動態(tài)語言本身沒有一個明確的界限,它們各有優(yōu)勢,又各有不足。
C#是一門優(yōu)美的語言,它融合了靜態(tài)和動態(tài)的優(yōu)勢,如果運用得當,必能動靜結(jié)合,呈現(xiàn)出一種和諧之美。特別是.NET平臺和語言的快速發(fā)展,更展現(xiàn)了動靜結(jié)合編程的活力。本篇是.NET動靜結(jié)合編程的第一篇,希望這個系列能和大家一起探討如何在.NET平臺上最大限度的發(fā)揮動靜結(jié)合的潛能。本人還只是.NET的初學者,對計算機理論的理解還很膚淺,文中錯誤歡迎批評指正,不足之處歡迎補充,謝謝!
被忽略的協(xié)議
談到“協(xié)議”,最先浮現(xiàn)在我們腦海中的可能是TCP/IP協(xié)議棧,但其實我們隨處都在和協(xié)議打交道。下面的例子,你看出協(xié)議來了嗎?
B(){ |
方法B假定方法A遵守:返回的ArrayList內(nèi)部都是string類型的元素。這就是它們之間的協(xié)議,這個協(xié)議不受編譯器靜態(tài)檢查的約束。所以,協(xié)議意味著運行時的不確定性,方法A完全可能在返回結(jié)果中裝入非string類型的元素,而這將導(dǎo)致B在運行時產(chǎn)生異常。 .NET2.0通過泛型集合增加了靜態(tài)類型約束:
B(){ |
約束有強弱
約束有強弱之分。越強的約束越安全,靜態(tài)性越強,受編譯器的支持越大;反之,越弱的約束,動態(tài)性越強,運行時靈活性越大。常??吹疥P(guān)于單方法接口和委托異同的討論,不少朋友認為它們完全等價。其實,它們有明顯不同的約束強度。接口是靜態(tài)類型約束,而委托只是靜態(tài)簽名約束,二者的強度完全不同。換句話說,委托具有更多的協(xié)議性,只要符合簽名,都可以被委托調(diào)用,而能被接口調(diào)用的對象必須實現(xiàn)該接口。
來看一個例子:需要編寫一個類A,其內(nèi)部需要日志功能;A采用IoC方式,不依賴于具體的Logger類,由使用者根據(jù)需要注入具體的實現(xiàn);同時,A的使用者B,希望采用第三方的Logger類。
a. 基于接口的IoC
interface ILogger { void Write(string msg); } |
b. 基于委托的IoC
class A{ |
比較上面兩個例子,我們就會發(fā)現(xiàn)委托比接口的約束要弱得多,使用起來靈活得多。基于接口的實現(xiàn)不得不增加一個Adapter去機械地適應(yīng)接口的類型約束,而基于委托的實現(xiàn)只需要保證方法簽名約束即可。
博文鏈接:http://www.cnblogs.com/weidagang2046/archive/2009/03/11/1408636.html
【編輯推薦】