特設多態

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

特設多態ad hoc polymorphism)是程序設計語言的一種多態,多態函數有多個不同的實現,依賴於其實參而調用相應版本的函數。因此,特設多態僅支持有限數量的不同類型。函數重載乃至運算符重載也是特設多態的一種。

概述[編輯]

特設多態與參數多態相對。ad hoc在這裡並不是貶義,而是指這類多態並不是類型系統的基本特性,不是像參數多態那樣適用於無窮多的類型,而是針對特定問題的解決方案。

換言之,參數多態對各模板參數的實現,是根據模板的通用(generically)的行為的抽象,即泛型的語義;而特設多態可以針對不同的版本實現完全不同的行為,或曰對於每個不同的模版參數都有單獨的版本來應對。打個比方:假如我們要把原材料切成兩半——

  • 參數多態:只要能「切」,就用工具來切割它;
  • 特設多態:根據原材料是鐵還是木頭還是什麼來選擇不同的工具來切。

歷史[編輯]

特設多態的名字來源於其發明人克里斯托弗·斯特雷奇於1967年8月在哥本哈根的計算機程序設計暑期學校發表的著名論文《編程語言中的基礎概念英語Fundamental Concepts in Programming Languages》,該文首次提出了參數多態、特設多態、左值右值等概念。[1]

早綁定[編輯]

多態的早綁定(early binding)是在編譯期,編譯器完成多態的分派機制:把多態函數、多態類型的名字根據模板參數綁定到具體的模板實現。

晚綁定[編輯]

多態的晚綁定英語Late binding是在運行期,程序確定即將要調用的多態函數的實現。Smalltalk實現了這種晚綁定機制。

例子[編輯]

加法運算符+假設可以運用到如下的情形:

  1. 1 + 2 = 3
  2. 3.14 + 0.0015 = 3.1415
  3. 1 + 3.7 = 4.7
  4. [1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
  5. [true, false] + [false, true] = [true, false, false, true]
  6. "bab" + "oon" = "baboon"

重載[編輯]

為此,需要的重載實現:

  • 第一種情形,需要整型加法;
  • 第二、第三種情形,需要浮點型加法。其中第三種情形需要隱式類型轉換(type coercion)。
  • 第四、第五種情形,需要list連接操作;
  • 第六種情形,需要字符串字面量英語literal string的連接操作。

因此,運算符名字+實際上使用了三到四種完全不同的函數實現。

參考文獻[編輯]

  1. ^ C. Strachey, Fundamental concepts in programming languages. Lecture notes for International Summer School in Computer Programming, Copenhagen, August 1967