品味Java子類型多態的魅力
|
摘要:
Java程序員經常運用對象的多態性使其在適當的地方調用適當的方法,顯得很神奇。這種方法通過繼承機制來實現。然而,一個嚴謹的實驗可以使其變得很明白,并揭示了,把多態性理解為與類型相關的概念更為合適,比繼承機制的解釋更好。這種理解可以幫助程序員更好的運用多態。
------WM.保羅 羅格斯
“polymorphism(多態)”一詞來自希臘語,意為“多種形式”。多數Java程序員把多態看作對象的一種能力,使其能調用正確的方法版本。盡管如此,這種面向實現的觀點導致了多態的神奇功能,勝于僅僅把多態看成純粹的概念。
Java中的多態總是子類型的多態。幾乎是機械式產生了一些多態的行為,使我們不去考慮其中涉及的類型問題。本文研究了一種面向類型的對象觀點,分析了如何將對象能夠表現的行為和對象即將表現的行為分離開來。拋開Java中的多態都是來自繼承的概念,我們仍然可以感到,Java中的接口是一組沒有公共代碼的對象共享實現。
多態的分類
多態在面向對象語言中是個很普遍的概念.雖然我們經常把多態混為一談,但實際上有四種不同類型的多態。在開始正式的子類型多態的細節討論前,然我們先來看看普通面向對象中的多態。
Luca Cardelli和Peter Wegner("On Understanding Types, Data Abstraction, and Polymorphism"一文的作者, 文章參考資源鏈接)把多態分為兩大類----特定的和通用的----四小類:強制的,重載的,參數的和包含的。他們的結構如下:

在這樣一個體系中,多態表現出多種形式的能力。通用多態引用有相同結構類型的大量對象,他們有著共同的特征。特定的多態涉及的是小部分沒有相同特征的對象。四種多態可做以下描述:
強制的:一種隱式做類型轉換的方法。
重載的:將一個標志符用作多個意義。
參數的:為不同類型的參數提供相同的操作。
包含的:類包含關系的抽象操作。
我將在講述子類型多態前簡單介紹一下這幾種多態。