1. 程式人生 > >C#本質論6.0第七章:接口

C#本質論6.0第七章:接口

派生 over 由於 轉型 face 逗號 接口類 明顯 value

接口:

概述:

接口能將實現細節和提供的服務完全隔離開。接口既不包括實現,也不包括數據。

接口實現:(待補)

要實現的接口和基類名稱以逗號分隔,基類在前,接口順序任意。類可實現多個接口,但只能從一個基類直接派生。一旦某個類聲明自己要實現接口,接口的所有成員都必須要實現。抽象類允許提供接口成員的抽象實現。

接口永遠不能實例化,不能使用new創建接口,所以接口沒有終結器。接口不能包含靜態成員。不可以為接口成員顯式的使用abstract修飾符。

  • 顯式成員實現:顯式實現的方法只能通過接口本身調用;為此最典型的方法是將對象轉型為接口。聲明顯式接口成員實現要在成員名之前附加接口名前綴。
  • 隱式成員實現:要隱式實現成員,只要求成員是公共的,而且簽名與接口成員的簽名相符,接口成員實現不需要override關鍵字或者其他任何表明該成員與接口關聯的指示符。此外,由於成員是像其他類成員那樣聲明的,所以可以像調用其他類成員那樣直接調用隱式實現的成員。

在實現類和接口之間轉換:

從實現類型向它的已實現接口的轉換是隱式轉換,不需要轉型操作符。實現類型的實例總是包含接口的全部成員,所以對象總是能成功轉換為接口類型。可能有多個類型都實現了同一個接口,所以無法保證從接口向實現類型的向下轉型能成功。因此,從接口轉換為它的某個實現類型,需要執行一次顯式的強制轉型。

interface IReadableSettingProvider
{
    string GetSetting(string name,string defaultValue);
}

interface ISettingProvider : IReadableSettingProvider
{
    string SetSetting(string name,string value);
}

class FileSettingProvider : ISettingProvider
{
    #region ISettingProvider Members
    public void SetSetting(string name,string value)
    {
        //...
    }
    #endregion
    
    #region IReadableSettingProvider
    public void GetSetting(string name,string defaultValue)
    {
        //...顯式實現GetSetting(),必須通過IReadableSettingProvider進行
    }
    #endregion
}
  • 可以使用類似於類實現多接口的方式實現多接口繼承。

接口上的拓展方法:

語法與作用於類時一樣,方法的第一個參數是要拓展的接口,該參數必須附加this修飾符。擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴。 僅當你使用 using 指令將命名空間顯式導入到源代碼中之後,擴展方法才位於範圍中。

C#不僅允許為特定類型的實例添加拓展方法,還允許為那些對象的集合添加拓展方法。

通過接口實現多繼承:

類只能從一個基類派生,但是可以實現任意數量的接口。

版本控制:

假定一個組件或應用程序供其他開發者使用,那麽在創建它的新版本時不應改動接口。接口在負責實現的類和使用接口的類之間訂立了契約,改動接口相當於改動契約,會使基於接口編寫的代碼失效。

C#本質論6.0第七章:接口