NO IMAGE

介面(interface)用來定義一種程式的協定。實現介面的類或者結構要與介面的定義嚴格一致。介面(interface)是向客戶承諾類或結構體的行為方式的一種合同,當實現某個介面時,相當於告訴可能的客戶:“我保證支援這個介面的方法,屬性等”,介面不能例項化,介面只包含成員定義,不包含成員的實現,成員的實現需要在繼承的類或者結構中實現。
C#中的委託是一種引用方法的型別,一旦為委託分配了方法,委託將與該方法具有完全相同的行為,委託方法的使用可以像其他任何方法一樣具有引數和返回值。委託物件能被傳遞給呼叫該方法引用的程式碼而無須知道哪個方法將在編譯時被呼叫。
從定義上來看似乎委託和介面沒什麼相似之處,但從隔離變化這個角度來看他們倒是有些相似之處,所以這裡我們把他們放到一起來比較一番。

委託和介面都允許類設計器分離型別宣告和實現。給定的介面可由任何類或結構繼承和實現;可以為任何類中的方法建立委託,前提是該方法符合委託的方法簽名。介面引用或委託可由不瞭解實現該介面或委託方法的類的物件使用。既然存在這些相似性,那麼類設計器何時應使用委託,何時又該使用介面呢?

在以下情況中使用委託:

當使用事件設計模式時。委託是事件的基礎,當需要某個事件觸發外界響應時,使用委託事件比較合適。

當呼叫方不需要訪問實現該方法的物件中的其他屬性、方法或介面時。

需要方便的組合,使用委託可以利用 =,-=方便的組合方法。

當類可能需要該方法的多個實現時,使用多播委託。

在以下情況中使用介面:

當存在一組可能被呼叫的相關方法時。

當類只需要方法的單個實現時。

當使用介面的類想要將該介面強制轉換為其他介面或類型別時。

當正在實現的方法連結到類的型別或標識時:例如比較方法。

使用單一方法介面而不使用委託的一個很好的示例是 IComparable 或 IComparable。IComparable 宣告 CompareTo 方法,該方法返回一個整數,以指定相同型別的兩個物件之間的小於、等於或大於關係。IComparable 可用作排序演算法的基礎,雖然將委託比較方法用作排序演算法的基礎是有效的,但是並不理想。因為進行比較的能力屬於類,而比較演算法不會在執行時改變,所以單一方法介面是理想的。