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