在編程語言理論和類型理論中,多型是使用一個符號來表示多種不同類型的技術。在物件導向編程中,多型提供了一個接口來處理不同數據類型的實體。這一概念源自生物學中的原理,某種生物或物種可以呈現出多種不同的形式或階段。最常見的多型形式包括:隨意多型(ad hoc polymorphism)、參數多型(parametric polymorphism)和子類型多型(subtyping),後者又稱為子型多型或包含多型。
多型類型系統的興趣在1990年代顯著增長,並且在十年的尾聲開始出現實用的實現。Christopher Strachey最早在其著作《編程語言的基本概念》中描述了隨意多型和參數多型,並將其列為“兩個主要類別”的多型概念。隨意多型是ALGOL 68的一項特性,而參數多型則是ML類型系統的核心特徵。彼得·韋格納( Peter Wegner)和盧卡·卡戴利(Luca Cardelli)在1985年的一篇論文中首次引入了包含多型這一術語,以刻畫子類型和繼承,並表示Simula是第一個實現這一特性的編程語言。
Christopher Strachey選擇“隨意多型”這個術語來描述可以應用於不同類型參數的多型函數,但它的行為取決於其應用的具體參數類型。這類多型也被稱為函數重載或操作符重載。這裡的“隨意”並不是貶義,而只是意味著這種多型形式不是類型系統的基本特性。
參數多型允許函數或數據類型以通用的方式編寫,以便在不依賴其類型的情況下處理值。這一概念同樣適用於數據類型和函數,能夠針對不同類型的值進行運算的函數被稱為多型函數。
某些編程語言利用子型多型的概念,限制在特定情況下可用的類型範圍。這種語言允許函數接受特定類型T的對象,但如果傳入屬於T的子類型S的對象,函數也能正常工作。它遵循利斯科夫替換原則。
行多型主要關注結構類型,容許使用所有類型擁有特定屬性值的值,而不損失其他類型的資訊。
多類型特性是一種比多型更一般的概念,通過提供特定數據類型的固定隨意情形,卻無需支持隨意組合子。
等級多型是數組編程語言如APL的一個定義特徵。這種編程模型的本質是隱性地將所有操作視為聚合操作,適用於任意維度的數組。
多型性可根據實現選擇的時間進行區分,即靜態(編譯時)或動態(運行時)。這分別稱為靜態調度和動態調度,對應的多型形式則稱為靜態多型和動態多型。靜態多型運行更快但要求額外的編譯器支持。
隨著編程語言的不斷發展,多型的概念也在不斷推陳出新。它不僅影響了編程的方式,也促使了許多其他理論和實踐的進步。當思想的界限被打破,是否意味著未來更為靈活的編程模式也將隨之而來?