14.2 Object Pascal中的泛型
? 在前面的例子中,我們已經看到了如何在Object Pascal
中定義和使用泛型類。我決定在深入討論這個非常重要但又相當復雜的技術細節之前,通過一個例子來介紹泛型這一特性。在從語言角度討論泛型之后,我們將列舉更多的例子,包括使用和定義泛型容器類,這是該語言中這種技術的主要用途之一。
? 我們已經看到,當你定義一個類時,你可以在尖括號中添加一個額外的“參數”,以占據稍后提供的類型的位置:
typeTMyClass<T> = classend;
? 泛型類型可以用作字段的類型(如我在前面的例子中所做的那樣),也可以用作屬性的類型、函數的參數或返回值的類型等。請注意,對于本地字段(或數組),不強制使用類型,因為有些情況下泛型類型僅用作結果、參數或者在類的聲明中沒有使用,而只是在類的某些方法的定義中使用。
? 這種擴展或泛型類型聲明形式不僅適用于類,也適用于記錄(即第5章中涵蓋的記錄,也可以具有方法、屬性和重載運算符)。泛型類還可以具有多個參數化類型,例如下面的情況,其中您可以為方法指定不同類型的輸入參數和返回值:
typeTPWGeneric<TInput, TReturn> = classpublicfunction AnyFunction(Value: TInput): TReturn;end;
? 在Object Pascal中,泛型的實現與其他靜態語言一樣,不需要運行時支持。泛型由編譯器和鏈接器處理,幾乎不需要運行時機制的支持。與在運行時綁定的虛函數調用不同,每個泛型類型的類方法只生成一次,并在編譯時生成!我們將看到這種方法可能存在的缺點,但好的一面是泛型類與普通類一樣高效,甚至更高效,因為減少了運行時檢查的需要。在我們學習一些內部細節之前,讓我先了解一些非常重要的規則,這些規則打破了傳統的Pascal語言類型兼容性規則。