委託和介面都允許類設計器分離型別宣告和實現。給定的介面可由任何類或結構繼承和實現;可以為任何類中的方法建立委託,前提是該方法符合委託的方法簽名。介面引用或委託可由不了解實現該介面或委託方法的類的物件使用。既然存在這些相似性,那麼類設計器何時應使用委託,何時又該使用介面呢?
在以下情況中使用委託:
·當使用事件設計模式時。
·當封裝靜態方法可取時。
·當呼叫方不需要訪問實現該方法的物件中的其他屬性、方法或介面時。
·需要方便的組合。
·當類可能需要該方法的多個實現時。
在以下情況中使用介面:
·當存在一組可能被呼叫的相關方法時。
·當類只需要方法的單個實現時。
·當使用介面的類想要將該介面強制轉換為其他介面或類型別時。
·當正在實現的方法鏈結到類的型別或標識時:例如比較方法。
使用單一方法介面而不使用委託的乙個很好的示例是 icomparable 或 icomparable。icomparable 宣告 compareto 方法,該方法返回乙個整數,以指定相同型別的兩個物件之間的小於、等於或大於關係。icomparable 可用作排序演算法的基礎,雖然將委託比較方法用作排序演算法的基礎是有效的,但是並不理想。因為進行比較的能力屬於類,而比較演算法不會在執行時改變,所以單一方法介面是理想的。將委託
方法與委託簽名匹配時,協變和逆變提供了一定程度的靈活性。協變允許將帶有派生返回型別的方法用作委託,逆變允許將帶有派生引數的方法用作委託。這使委託方法的建立變得更為靈活,並能夠處理多個特定的類或事件。
當委託方法的返回型別具有的派生程度比委託簽名更大時,就稱為協變委託方法。因為方法的返回型別比委託簽名的返回型別更具體,所以可對其進行隱式轉換。這樣該方法就可用作委託。
協變使得建立可被類和派生類同時使用的委託方法成為可能。
class mammals
class dogs : mammals
class program
public static dogs secondhandler()
static void main()
}逆變
當委託方法簽名具有乙個或多個引數,並且這些引數的型別派生自方法引數的型別時,就稱為逆變委託方法。
因為委託方法簽名引數比方法引數更具體,因此可以在傳遞給處理程式方法時對它們進行隱式轉換。
這樣逆變使得可由大量類使用的更通用的委託方法的建立變得更加簡單。
class mammals
class dogs : mammals
class program
public static void secondhandler(dogs sheepdog)
static void main(string args)
}
協變與逆變
目錄 1.協變 2.逆變 在泛型之前,我們都知道可以將乙個派生類物件賦值給基類變數,這叫做賦值相容性。看下面這個例子 相容性示意圖如上。但是當我們新增泛型機制時 class animal class dog animal delegate t factory class program static...
逆變與協變
一 遇到問題 這是基於.net3.5開發,實際工作中遇到乙個問題。假設我們有乙個 base 類,乙個 derived 類,derived 繼承了 base。如下 classbase classderived base 當我用ienumerable作為形參,list作為實參時,發現編譯出錯了!原本父類...
C 委託中的協變與逆變
1 簽名 返回值型別和引數。2 委託呼叫要求委託的簽名必須與呼叫的方法的簽名匹配,如果簽名不匹配,將無法通過編譯器的型別檢查。3 協變 允許所呼叫方法的返回型別可以是委託的返回型別的派生型別,當委託方法的返回型別具有的派生程度比委託簽名更大時,就稱為協變委託方法。協變委託方法的優點是 使得建立可被類...