上述設計方案肯定是令人滿意的。系統內新類型的加入涉及添加或修改不同的類,但沒有必要在系統內對代碼作大范圍的改動。除此以外,RTTI並不象它在RecycleA.java裡那樣被不當地使用。然而,我們仍然有可能更深入一步,以最“純”的角度來看待RTTI,考慮如何在垃圾分類系統中將它完全消滅。
為達到這個目標,首先必須認識到:對所有與不同類型有特殊關聯的活動來說——比如偵測一種垃圾的具體類型,並把它置入適當的垃圾筒裡——這些活動都應當通過多形性以及動態綁定加以控制。
以前的例子都是先按類型排序,再對屬於某種特殊類型的一系列元素進行操作。現在一旦需要操作特定的類型,就請先停下來想一想。事實上,多形性(動態綁定的方法調用)整個的宗旨就是幫我們管理與不同類型有特殊關聯的信息。既然如此,為什麼還要自己去檢查類型呢?
答案在於大家或許不以為然的一個道理:Java只執行單一派遣。也就是說,假如對多個類型未知的對象執行某項操作,Java只會為那些類型中的一種調用動態綁定機制。這當然不能解決問題,所以最後不得不人工判斷某些類型,才能有效地產生自己的動態綁定行為。
為解決這個缺陷,我們需要用到“多重派遣”機制,這意味著需要建立一個配置,使單一方法調用能產生多個動態方法調用,從而在一次處理過程中正確判斷出多種類型。為達到這個要求,需要對多個類型結構進行操作:每一次派遣都需要一個類型結構。下面的例子將對兩個結構進行操作:現有的Trash系列以及由垃圾筒(Trash Bin)的類型構成的一個系列——不同的垃圾或廢品將置入這些筒內。第二個分級結構並非絕對顯然的。在這種情況下,我們需要人為地創建它,以執行多重派遣(由於本例只涉及兩次派遣,所以稱為“雙重派遣”)。