自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET動靜結(jié)合編程 接口和委托的約束強度

開發(fā) 后端
程序世界有兩種神秘的元素,它們無處不在,卻常常未被察覺。它們一動一靜,卻又和諧相處。我給這對兄弟取上不太恰當?shù)拿郑粋€叫“協(xié)議”,一個叫“約束”。我們常??吹降膭討B(tài)語言、靜態(tài)語言背后,本質(zhì)上就是“協(xié)議”與“約束”兩種元素的作用。

靜態(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(){
    ArrayList lst = A();
    foreach (string item in lst){
        Console.WriteLine(item.Length);
    }
}

方法B假定方法A遵守:返回的ArrayList內(nèi)部都是string類型的元素。這就是它們之間的協(xié)議,這個協(xié)議不受編譯器靜態(tài)檢查的約束。所以,協(xié)議意味著運行時的不確定性,方法A完全可能在返回結(jié)果中裝入非string類型的元素,而這將導(dǎo)致B在運行時產(chǎn)生異常。 .NET2.0通過泛型集合增加了靜態(tài)類型約束:

B(){
    List lst = A();
    foreach (string item in lst){
        Console.WriteLine(item);
    }
}

這樣,B再也不用擔心lst內(nèi)部存在非string類型的元素了,一切得益于泛型為A加上的靜態(tài)類型約束。

約束有強弱

約束有強弱之分。越強的約束越安全,靜態(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); }

class A{
    ILogger Logger { get; set; }
    void F() {}
}

class B{
    G(){
        A a = new A();
        a.Logger = new LogAdapter(); //注入依賴
        a.F();
    }
}

//對第3方Logger進行包裝
class LogAdapter : ILogger{
    Write(string msg){//這里調(diào)用第3方的Logger類}
}

b. 基于委托的IoC

class A{
    Action Logging { get; set; }
    void F() {}
}

class B{
    G(){
        A a = new A();
        a.Logging = delegate(string msg){ //調(diào)用第3方Logger類 };
        a.F();
    }
}

比較上面兩個例子,我們就會發(fā)現(xiàn)委托比接口的約束要弱得多,使用起來靈活得多。基于接口的實現(xiàn)不得不增加一個Adapter去機械地適應(yīng)接口的類型約束,而基于委托的實現(xiàn)只需要保證方法簽名約束即可。

博文鏈接http://www.cnblogs.com/weidagang2046/archive/2009/03/11/1408636.html

【編輯推薦】

  1. 深入解析C#編程中的方法重載
  2. 使用.NET Array類的Sort方法分類數(shù)值
  3. 詳解C# 4.0中必選參數(shù)與可選參數(shù)混合的問題
責任編輯:彭凡 來源: cnblog
相關(guān)推薦

2009-03-27 09:26:20

定義Duck TypingC#

2009-09-08 15:28:24

C#委托

2010-08-03 08:52:23

委托接口

2011-05-20 16:33:47

委托接口

2011-06-16 15:14:17

VB.NET事件委托

2009-08-26 17:05:55

.NET委托

2009-08-18 11:08:24

.Net Framew

2009-09-02 17:51:36

.NET委托

2009-08-05 17:04:14

.NET委托

2009-10-15 09:12:29

.NET委托

2013-03-12 13:52:56

編程

2021-01-13 10:40:42

編程語言PLCGraph

2024-06-28 10:19:02

委托事件C#

2010-01-05 18:21:33

.NET Framew

2009-03-26 10:11:47

2009-08-03 13:23:04

C#編程組件-事件-委托

2012-04-16 13:22:56

CORBAJavaC++

2009-07-20 09:53:43

Java混合編程

2022-01-07 08:24:13

STM32枚舉結(jié)構(gòu)體

2010-05-06 10:17:58

混合編程Java程序員
點贊
收藏

51CTO技術(shù)棧公眾號