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

我的設計模式之旅[4]:運用 C# Generic 改良 Strategy Pattern (下)

     編輯:關於C語言

承上篇,C++ Template 成功解決策略介面型別綁定問題。本文嘗試用 C# 2.0 Generics 達成相同目標,並探討兩者關鍵差異:C# Generic 屬於「受限泛型」,需透過 where 子句約束型別參數。

核心難點:where 约束

策略介面改為泛型:

interface IShape<T> {
    void draw(T grapher);
}

具體策略類別必須宣告:

class Triangle<T> : IShape<T> where T : IGrapher {
    public void draw(T grapher) {
        Console.WriteLine("Draw {0:s} in Triangle", grapher.getText());
    }
}

where T : IGrapher 表示型別參數 T 必須實作 IGrapher 介面。這是 C# Generic 與 C++ Template 最大不同:C++ 編譯期鴨子型別,C# 則要求明確介面約束。

定義 IGrapher 介面

interface IGrapher {
    string getText();
}

確保所有傳入策略的物件皆擁有 getText() 方法,編譯器才允許呼叫。

C++ Template vs C# Generic 比較

特性C++ TemplateC# Generic
型別檢查時機編譯期實例化時定義期即檢查約束
型別限制無(鴨子型別)需透過 where 约束
程式碼膨脹會產生多份實例碼單一份 IL 共享
執行效能零額外負擔略有 boxing/unboxing 考量

雖然 C# Generic 較嚴謹,但也帶來更好的型別安全與 IntelliSense 支援。

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