|
在網(wǎng)上常常能看到文章講面向?qū)ο蟮娜蠡咎卣?繼承"、"封裝"、"多態(tài)",我以為這是坊間流傳的最不靠譜的一個說法。本文先談?wù)勂渲兄v到的一個特性:多態(tài)。多態(tài)是一個跟面向?qū)ο笸耆坏母拍?,兩者之間可以說沒有任何必然聯(lián)系。當然口說無憑,下面是我經(jīng)過很長時間查找到的一些來源比較可靠的資料對多態(tài)的說法。 最早可查證的關(guān)于多態(tài)的說法是一篇叫做 Fundamental Concepts in Programming Languages的論文,文中對多態(tài)的討論主要是用于實現(xiàn)運算符的重載版本選擇,文中把多態(tài)分為兩種: ad-hoc多態(tài)和參數(shù)多態(tài),ad-hoc多態(tài)即指系統(tǒng)根據(jù)上下文自己決定如何選擇運算符的行為,比如各種原生的運算符都在此列。參數(shù)多態(tài)則是根據(jù)參數(shù)類型選擇。文中對參數(shù)多態(tài)的解釋則是用了一個頗為"函數(shù)式"的例子,根據(jù)傳入的函數(shù)類型參數(shù)的函數(shù)簽名來決定返回值類型。 1985年左右的一篇論文On Understanding Types, Data Abstraction, and Polymorphis則詳細地論述總結(jié)了多態(tài)性的概念,文中給出了多態(tài)的分類: polymorphism(多態(tài)) |-universal | |- parametric | \- inclusion \-ad-hoc |- overloading \- coercio 這篇文章對多態(tài)的論述比較系統(tǒng),網(wǎng)上也有pdf版本,有興趣的朋友可以詳細閱讀。(inclusion多態(tài)聽起來比較陌生,但是其實它的另一個名稱是subtype Polymorphism,這也是唯一一種跟面向?qū)ο笙嚓P(guān)的多態(tài)) 從上面的發(fā)展可以看出,多態(tài)是一個差不多跟面向?qū)ο笸瑫r(60年代)誕生的編程概念,有自己獨立的體系結(jié)構(gòu),并且這個概念非常廣泛地用于很多種編程語言的設(shè)計當中。 關(guān)于面向?qū)ο蟾鄳B(tài)的關(guān)系,下面一段話用來解釋非常恰當(來自The C++ programming language), Since both(wintercn注:根據(jù)上下文指template和abstract class) allow an algorithm to be expressed once and applied to a variety of types, people sometimes refer to both as polymorphic. 意思是:因為template和abstract class兩種機制都能允許一個算法表達一次而用在多種不同類型當中,所以人們把兩種都稱作多態(tài)。后文還講到abstract class提供的是運行時多態(tài),template提供的是編譯時多態(tài)。(有趣的是,連面向?qū)ο蟮拇硇哉Z言之一C++本身都涉及到了一種跟面向?qū)ο蠛翢o關(guān)系的多態(tài)類型。)
所以事實上,多態(tài)并非面向?qū)ο蟮乃疆a(chǎn),更不是什么面向?qū)ο蟮幕咎卣鳎鄳B(tài)和面向?qū)ο蟮年P(guān)系是:面向?qū)ο笾械某橄箢?,提供了一種運行時多態(tài)的實現(xiàn)方式。 |
|
|