首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:介面設計與實作全攻略

     編輯:關於.NET

14.1 類別與介面實作

CLR 不支援多重繼承,透過介面模擬。介面定義一組方法簽章的名稱。類別實作介面必須提供所有方法實作。抽象類別可將介面方法宣告為 abstract,留給衍生類別實作。

14.2 定義介面

  • 可包含方法/事件/屬性(本質為方法)。
  • 不可包含靜態成員(含常數/列舉)。
  • 介面間可「繼承」(實為包含另一介面的約定)。
  • 所有成員預設為 public,無需宣告。

14.3 實作介面

實作的介面方法必須標記為 public(IL 中為 virtual 和 sealed,不允許衍生類別覆寫)。若需允許覆寫,須顯式標記為 virtual。

14.4 呼叫介面方法

執行期可將變數從一種介面類型轉型為另一種,前提是物件實作了這兩種介面。值類型實作介面時,轉為介面類型前必須先裝箱(介面變數必須參考堆上物件)。

14.5 介面方法的隱式/顯式實作 (EIMI)

  • 隱式實作:預設方式,可存取性必為 public。
  • 顯式實作 (EIMI):以介面名稱作為方法名稱前綴。不屬於類型物件一部分,避免暴露行為。不可指定可存取性(IL 標記為 private),僅能透過介面變數存取。不可標記為 virtual,不可被覆寫。
public interface ITest { void Test(); }
public class TestClass : ITest {
    public void Test() { Console.WriteLine("1"); }
    void ITest.Test() { Console.WriteLine("2"); }
}
TestClass t = new TestClass();
t.Test();        // 輸出 1
ITest it = (ITest)t;
it.Test();       // 輸出 2

14.6 泛型介面三大優勢

  1. 編譯期型別安全:IComparable<Int32> 直接接受 Int32,拒絕 String。
  2. 操作值類型減少裝箱:按值傳遞。
  3. 同一類別可多次實作同一泛型介面(不同類型參數視為不同介面)。

14.7 泛型介面參數約束

  • 可將類型參數約束為多個介面,強制傳入類型實作所有約束介面。
  • 減少裝箱:產生特定 IL,直接在值類型上呼叫介面方法。

14.9 使用 EIMI 改善編譯期型別安全

針對非泛型介面,以 EIMI 實作型別安全的強類型方法,並將介面方法轉呼叫強類型方法。

14.10 EIMI 缺點

  1. 無法說明具体如何實作 EIMI 方法。
  2. 值類型轉介面類型會被裝箱。
  3. EIMI 方法不可被衍生類型繼承。

14.11 介面 vs 類別繼承

類別繼承介面
表示 IS-A表示 CAN-DO
易用,不必提供所有實作無上述優點
可 override/new 覆寫
易於在基底類別新增成員

值類型繼承自 System.ValueType,只能使用介面。FCL 集合基於介面,因各集合間極少共享程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved