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