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