首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 動靜結合編程(一):介面 vs 委託——約束強度與靈活性的權衡

     編輯:關於C#

協議與約束:動靜兩極

程式世界兩大隱性元素:協議(動態、執行期、不確定)與 約束(靜態、編譯期、確定)。靜態語言側重約束,動態語言側重協議。C# 融合兩者優勢,得動靜結合之美。

被忽視的協議

void B()
{
    ArrayList list = A(); // 協議:A 回傳的 ArrayList 內部皆為 string
    foreach (string s in list) Console.WriteLine(s.Length);
}

此協議 無編譯器保護,A 可塞入非 string 導致 B 運行期炸裂。

.NET 2.0 泛型引入靜態約束

void B()
{
    List list = A(); // 編譯期保證元素型別
    foreach (string s in list) Console.WriteLine(s);
}

約束強弱對比:介面 vs 委託

單方法介面與委託常被視為等價,實則 約束強度截然不同:

  • 介面:靜態型別約束 —— 物件 必須宣告實作 該介面
  • 委託:靜態簽名約束 —— 只要方法 簽名相容 即可,無型別依賴

委託擁有更多「協議性」,靈活得多。

實戰對比:第三方 Logger 整合

介面 IoC:需 Adapter 包裝

interface ILogger { void Write(string msg); }
class A { public ILogger Logger { get; set; } void F() {} }
class B { void G() { var a = new A(); a.Logger = new LogAdapter(); a.F(); } }
class LogAdapter : ILogger { void Write(string msg) { ThirdPartyLogger.Log(msg); } }

委託 IoC:零包裝,直接賦值

class A { public Action Logging { get; set; } void F() {} }
class B { void G() { var a = new A(); a.Logging = msg => ThirdPartyLogger.Log(msg); a.F(); } }

委託版本:無新增類別、無型別耦合、僅需簽名匹配。介面約束強、委託約束弱、委託更靈活。

系列預告

後續將探討 Duck Typing、泛型委託妙用、表達式樹與 Lambda、.NET 4.0 動態編程等主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved