駁“物件導向的基本特性多態”

來源:互聯網
上載者:User

在網上常常能看到文章講物件導向的三大基本特徵"繼承"、"封裝"、"多態",我以為這是坊間流傳的最不靠譜的一個說法。本文先談談其中講到的一個特性:多態。多態是一個跟物件導向完全正交的概念,兩者之間可以說沒有任何必然聯絡。當然口說無憑,下面是我經過很長時間尋找到的一些來源比較可靠的資料對多態的說法。

最早可查證的關於多態的說法是一篇叫做 Fundamental Concepts in Programming Languages的論文,文中對多態的討論主要是用於實現運算子的重載版本選擇,文中把多態分為兩種: ad-hoc多態和多重參數變形,ad-hoc多態即指系統根據上下文自己決定如何選擇運算子的行為,比如各種原生的運算子都在此列。多重參數變形則是根據參數類型選擇。文中對多重參數變形的解釋則是用了一個頗為"函數式"的例子,根據傳入的函數型別參數的函數簽名來決定傳回值類型。 

1985年左右的一篇論文On Understanding Types, Data Abstraction, and Polymorphis則詳細地論述總結了多態性的概念,文中給出了多態的分類:polymorphism(多態)|-universal

| |- parametric 

| \- inclusion

\-ad-hoc

  |- overloading

  \- coercio 

這篇文章對多態的論述比較系統,網上也有pdf版本,有興趣的朋友可以詳細閱讀。(inclusion多態聽起來比較陌生,但是其實它的另一個名稱是subtype Polymorphism,這也是唯一一種跟物件導向相關的多態)

從上面的發展可以看出,多態是一個差不多跟物件導向同時(60年代)誕生的編程概念,有自己獨立的體繫結構,並且這個概念非常廣泛地用於很多種程式設計語言的設計當中。

關於物件導向跟多態的關係,下面一段話用來解釋非常恰當(來自The C++ programming language), 

Since both(wintercn註:根據上下文指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兩種機制都能允許一個演算法表達一次而用在多種不同類型當中,所以人們把兩種都稱作多態。後文還講到abstract class提供的是運行時多態,template提供的是編譯時間多態。(有趣的是,連物件導向的代表性語言之一C++本身都涉及到了一種跟物件導向毫無關係的多態類型。)

 

所以事實上,多態並非物件導向的私產,更不是什麼物件導向的基本特徵,多態和物件導向的關係是:物件導向中的抽象類別,提供了一種運行時多態的實現方式。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.