本頁使用了標題或全文手工轉換

多型 (電腦科學)

維基百科,自由的百科全書
跳至導覽 跳至搜尋

程式語言類型論中,多型(英語:polymorphism)指為不同資料類型的實體提供統一的介面[1]多型類型(英語:polymorphic type)可以將自身所支援的操作套用到其它類型的值上。[2]

電腦程式執行時,相同的訊息可能會送給多個不同的類別之物件,而系統可依據物件所屬類別,引發對應類別的方法,而有不同的行為。簡單來說,所謂多型意指相同的訊息給予不同的物件會引發不同的動作。

多型也可定義為「一種將不同的特殊行為和單個泛化記號相關聯的能力」。

多型可分為變數多型與函式多型。變數多型是指:基本類型的變數(對於C++是參照或指標)可以被賦值基本類型物件,也可以被賦值衍生類型的物件。函式多型是指,相同的函式呼叫介面(函式名與實參表),傳送給一個物件變數,可以有不同的行為,這視該物件變數所指向的物件類型而定。因此,變數多型是函式多型的基礎。

多型還可分為:

  • 動態多型(dynamic polymorphism):生效於執行期
  • 靜態多型(static polymorphism):將不同的特殊行為和單個泛化記號相關聯,由於這種關聯處理於編譯期而非執行期,因此被稱為「靜態」。可以用來實現類型安全、執行高效的同質物件集合操作。C++ STL不採用動態多型來實現就是個例子。
    • 非參數化多型或譯作特設多型(Ad-hoc polymorphism):
      • 函式多載(Function Overloading)
      • 運算子多載(Operator Overloading)
      • 帶變數的宏多型(macro polymorphism)
    • 參數化多型(Parametric polymorphism):把類型作為參數的多型。在物件導向程式設計中,這被稱作泛型編程

對於C++語言,帶變數的宏和函式多載(function overload)機制也允許將不同的特殊行為和單個泛化記號相關聯。然而,習慣上並不將這種函式多型(function polymorphism)、宏多型(macro polymorphism)展現出來的行為稱為多型(或靜態多型),否則就連C語言也具有宏多型了。談及多型時,預設就是指動態多型,而靜態多型則是指基於模板的多型。

歷史[編輯]

1967 年,英國電腦科學家克里斯多福·斯特雷奇在他的講義合集《程式語言中的基礎概念英語Fundamental Concepts in Programming Languages》中,首次提出了特設多型和參數多型的概念。[3]

1985 年,彼得·華格納英語Peter Wegner盧卡·卡代利英語Luca Cardelli在論文中引入了術語「蘊含多型」(英語:inclusion polymorphism)來為子類型和繼承建模。[2]。不過子類型和繼承本身在 1967 年就已經在 Simula 有對應的實現。

例子[編輯]

比如有動物(Animal)之類別(Class),而且由動物繼承出類別雞(Chicken)和類別狗(Dog),並對同一源自類別動物(父類別)之一訊息有不同的響應,如類別動物有「叫()」之動作,而類別雞會「啼叫()」,類別狗則會「吠叫()」,則稱之為多型。

參見[編輯]

參考資料[編輯]

  1. ^ Bjarne Stroustrup. Bjarne Stroustrup's C++ Glossary. February 19, 2007. polymorphism – providing a single interface to entities of different types. 
  2. ^ 2.0 2.1 Cardelli, Luca; Wegner, Peter. On understanding types, data abstraction, and polymorphism (PDF). ACM Computing Surveys (New York, NY, USA: ACM). December 1985, 17 (4): 471–523. ISSN 0360-0300. doi:10.1145/6041.6042. : "Polymorphic types are types whose operations are applicable to values of more than one type."
  3. ^ Christopher Strachey. Fundamental Concepts in Programming Languages (PDF). www.itu.dk (Kluwer Academic Publishers). [2018-06-29]. (原始內容 (PDF)存檔於2017-08-12).