程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#動靜結合編程之一: 接口和委托的約束強度(2)

C#動靜結合編程之一: 接口和委托的約束強度(2)

編輯:關於C語言

來看一個例子:需要編寫一個類A,其內部需要日志功能;A采用IoC方式,不依賴於具體的Logger類, 由使用者根據需要注入具體的實現;同時,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){//這裡調用第3方的Logger類}
}

b. 基於委托的IoC

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

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

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

後續

後續章節打算陸續介紹DuckTyping、泛型委托妙用、表達式樹和lambda、.Net4.0動態編程等相關內容 ,敬請關注,多謝批評!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved