CLR via C#:接口

接口:接口實際上是對一組函數簽名進行統一命名。具有以下特性:
1.C#中用interface關鍵字來定義接口,並且約定接口名字以I開頭。
2.接口中的函數默認爲public abstruct virtual instance函數,並且只能以"返回類型 函數名(參數列表)“的形式來聲明函數。
3.CLR只允許類繼承單個類和多個接口。
4.CLR只允許結構體繼承多個接口。
5.CLR只允許接口繼承多個接口。
6.類和結構體在繼承接口時,必須實現全部的接口函數。
7.子類型可以隱式或者顯示轉換成接口類型,但是接口類型必須顯示轉換成子類型。當子類型是結構體類型時,當轉換成接口類型時就會發生裝箱操作。

隱式實現接口函數:具有以下特性:
1.必須以"public 可選virtual 返回類型 函數名稱(參數列表)"的形式來實現接口函數。
2.實現的接口函數沒有指定virtual時,編譯器默認設置成virtual sealed。
3.在結構體中實現的接口函數指定爲virtual時,編譯器會報錯。
4.實現的接口函數既可以被子類型實例調用也可以被接口類型變量調用。

顯示實現接口函數:具有以下特性:
1.必須以"返回類型 接口名稱.函數名稱(參數列表)“的形式來實現接口函數。
2.編譯器默認設置實現的接口函數爲private virtual sealed。
3.實現的接口函數只能被接口類型變量調用。
4.真實的函數名爲"接口名稱.函數名稱”,從而避免編譯時出現二義性。
5.開發者應該儘量不要使用顯示實現接口函數,因爲它往往會造成類型變的不好用,而且文檔中也沒有說明怎麼使用它。

泛型接口:具有以下特性:
1.在選擇FCL中的接口類型時,應該儘量選擇泛型接口類型。
2.泛型接口提供了出色的編譯時類型安全性。
3.泛型接口在處理值類型時,裝箱次數會少很多。
4.子類型可以實現泛型接口若干次,只要每次提供不同的泛型類型實參即可。
5.當泛型類型參數約束爲多個接口時,泛型類型實參必須實現所有的接口。

設計成基類還是接口:參考規範如下所示:
1.值類型必須從ValueType繼承,所以只能爲值類型設計接口。
2.當能建立起IS-A(表明有很多相同的代碼)關係時,應該設計成基類;當能建立起CAN-DO(表明很多相同的行爲,但代碼可能不一樣)關係時,應該設計成接口。
3.想要易用性高的話就設計成基類,否則就設計成接口。因爲派生類只需稍作修改即可;而而接口的繼承者們必須實現所有的接口函數。
4.想要一致性實現的話就設計成基類,否則就設計成接口。因爲基類具有默認行爲且在所有的派生類中保持不變;而接口的繼承者們可以自己定義行爲。
5.想要更好的版本控制就設計成基類,否則就設計成接口。因爲基類添加方法後,派生類自動繼承且無需重新編譯;而接口改動函數的話,所有接口的繼承者們都必須修改代碼並重新編譯。
6.可以既設計基類,也設計接口,從而帶來更大的靈活性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章