泛型概念
Doug McIlroy於1968年發表的一篇著名論文"Mass Producedoftware Components",那篇論文提出了"reusable components"(可復用軟體組件,又稱為軟體積木或軟體IC)的遠景。過去數十年來,泛型技術比較屬於研究單位中的驕客,實現出來且被廣泛運用的產品極少。雖然Ada, ALGOL68, Eiffel, C++等語言都支援泛型相關語法,但是直到C++ STL的出現,泛型技術在軟體發展圈內才開始有了大量反響。
泛型(generics, genericity)又稱為「參數化類型(parameterized types)」或模板(templates),或所謂「參數式的多型(parametric polymorphism)」。主要是一種類型代換(type substitution)概念,是和繼承(Inheritance)不同而互補的一種組件復用機制。泛型技術最直接被聯想到的用途之一就是建立資料群集(collections),允許使用者將某些特定類型的資料(物件)置入其中,並於取出時明確知道元素的類型,無需做(向下)轉型動作。假設某個泛型程式庫提供list,你便可以明確宣告一個內含int或double或Shape(使用者自定類型)元素的list(這是C++套用型式),或明確宣告一個內含Integer 元素的list(這是Java套用型式),如下:
list<int> iList; // in C++
LinkedList<Integer> iList = new LinkedList<Integer>(); // in Java
組件(此處狹義地指classes)復用技術中,繼承和泛型的區別在哪裡?
可以這么說,當你運用繼承,面對不同的類型(types)你將擁有相同的接口,而那些類型獲得了多型性(多態性,Polymorphics)。當你運用泛型,你將擁有許多不同的類型,並得以相同的演算法(如排序、搜尋)作用在它們身上。舉個例子,發展繪圖系統時我們往往會設計一個CShape,並令所有(幾何乃至非幾何)形狀皆衍生自它。為了讓所有衍生自CShape 的形狀都有自繪能力,並有相同接口draw(),你必須使用繼承技術並令draw()為一個擬函式。此處所以採用繼承和擬機制,是因為draw()接口相同但演算法不同(不同的形狀當然有不同的繪圖法)