电竞比分网-中国电竞赛事及体育赛事平台

分享

駁“面向?qū)ο蟮幕咎匦远鄳B(tài)”

 ihacku 2015-05-30

在網(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)方式。 


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多