第十五章 介面
摘要:
介面的應用及完全限定名方式定義介面的應用。
一、 介面與繼承
l C#支援單實現繼承和多介面繼承
l 介面中可以定義:事件、無參屬性(屬性)、含參屬性(索引器);C#不允許介面定義任何靜態成員(CLR卻允許定義靜態成員);CLR不允許介面定義執行個體欄位和構造器。
l 預設為public abstract 方法,但不可用任何修飾符進行修飾(包括public)
l 將實值型別轉換為介面類型(假設其實現了某個介面),則實值型別被裝箱為參考型別,以調用其中的介面方法。
實現介面繼承或實現繼承的原則:
l 存在IS-A關係使用實現繼承,存在CAN-DO關係使用介面繼承
l 實現繼承可繼承父類型的實現,由於介面中沒有定義方法的實現,因此繼承後必須實現方法
l考慮到每個人對介面實現的不同,使用實現繼承可同一部分功能的實現
l 為父類型添加方法可能不影響使用繼承自該類型實現的使用者,而為介面添加方法導致使用者必須為新方法添加實現
二、 利用介面改變已裝箱類型中的欄位
實際上是將已裝箱類型轉型為介面類型,然後通過調用方法進行值改變。
因為對已裝箱類型進行拆箱到原實值型別將在堆棧上聲稱新的實值型別,調用這個新的實值型別的方法不能改變以裝箱類型的值。
三、 實現多個有相同方法的介面
使用 介面名.方法名 的形式聲明實現了那個介面的方法。成為 完全限定介面名,這樣定義的方法被認為是私人方法,不能使用類型本身調用;當將類型轉換為介面類型時,完全限定介面名定義的方法又變成一個公有方法。(比較奇特,也很有用);使用完全限定介面名定義的方法不能使用任何存取修飾詞。
四、顯示介面成員實現
問題的提出:通常介面接受的參數為Object,這樣的參數非強型別安全的,可能需要在我們自訂類型的介面實現中定義強型別安全的方法,同時也需要實現“介面合約”
問題解決:通過上面的完全限定介面名方式定義介面方法,可達到這樣的效果。
優點:獲得強型別支援,可在編譯期發現類型不符問題,而不是到運行期。同時,調用自訂的方法不必進行裝箱操作,提高了效率。
缺點:由於我們在類型中隱藏了介面實現(必須將轉型為介面才能暴露出介面定義的方法),因此可能對使用造成不便,因此應該慎用該方法。