大B:“演算法和多型性是程式設計中的主要思想,但是靠這些術語,我們很難表述其具體含義。如果想向其他人表示一個方法,你可以編輯原始碼,然後據此向其他人仔細講述。”
小A:“喔。”
大B:“在某些情況下,演算法也許完全包含在一個方法中。但是演算法的實現經常依賴於多個方法的相互使用。”
小A:“嗯。”
大B:“IntroductiontoAlgorithms(演算法導論)給出了演算法的定義:演算法是定義良好的計算過程,把資料值或者資料集合作為輸入,並輸出某資料值或者資料集合。演算法是一個過程——包含一些指令序列,接收輸入,產生輸出。”
小A:“嗯。”
大B:“單個方法也許是個演算法:它接受輸入——其引數列表——併產生輸出作為返回值。然而,在面向物件程式設計時很多演算法會需要多個方法。演算法就是需要完成某項任務的過程。它們也許表現為某方法的一部分,或者呼叫多個方法。在面向物件應用程式中,需要多個方法的演算法經常依賴多型性來充許單個操作的多種實現。”
小A:“多型性是方法呼叫關於依賴被呼叫的操作和呼叫接收者類的基本原則。”
大B:“是啊!比如,你也許關心當Java遇到表示式isTree()時,會執行哪個方法。這關鍵是看方法的依賴關係。”
小A:“喔。”
大B:“如果物件m是Machine類的例項Java會呼叫Machine.isTree()。如果m是MachineComposite的一個例項,Java會呼叫MachineComposite.isTree()。非正式地說,多型性意味著要為合適的物件呼叫合適的方法。很多設計模式都使用多型性,在某些情況下,多型性與該模式的目標緊緊相連。”
小A:“操作、方法、簽名以及演算法這四個概念很容易讓人混淆。”
大B:“但是,搞清楚這些術語間區別將有助於我們描述一些重要的概念。”
小A:“是啊!”
大B:“操作,類似於方法簽名,定義了服務的規範。當談到許多方法可能會有相同的介面的時候,我們可以使用操作這個術語。當討論方法查詢規劃的時候,我們可以使用簽名這個術語。一個方法的定義包括方法簽名、修飾符、返回型別以及方法體;而方法簽名又包括方法名和引數列表。一個方法通常有一個方法簽名,並實現一個操作。啟動一個方法的常見方式是呼叫它。方法結束的常見方式是讓它返回,但是對任務程式而言,當遇到不可處理的異常時,任何方法都會停止執行。演算法是一個接收輸入併產生輸出的過程。方法也接收輸入、產生輸出,另外它還包含一個過程化的方法體,因此常常有人將方法體看作是一個演算法。然而,一個演算法的過程可能會涉及很多操作和方法,也可能僅僅是另外一個方法的一部分。演算法這個術語最好是在談到產生某個結果的過程時使用。很多設計模式都涉及到把一個操作分散到幾個類中去。因而我們可以說這些模式依賴於多型性,即具體呼叫哪個方法依賴於收到呼叫的物件的型別。不同的類可以用不同的方式來實現同一個操作。換句話說,Java支援多型性機制。”