對象導論之伴隨多態的可互換對象

伴隨多態的可互換對象
  在處理類型的層次結構時,經常想把一個對象不當作它所屬的特定類型來對待,而是將其當作其基類的對象來對待。這使得人們可以編寫出不依賴於特定類型的代碼。在“幾何形”的例子中,方法操作的都是泛化(generic)的形狀,而不關心它們是圓形、正方形、三角形還是其他什麼尚未定義的形狀。所有的幾何形狀都可以被繪製、擦除和移動,所以這些方法都是直接對一個幾何對象發送消息;它們不用擔心對象將如何處理消息。
  這樣的代碼是不會受添加新類型影響的,而且添加新類型是擴展一個面向對象程序以便處理新情況的最常用的方式。例如,可以從“幾何形”中導出一個新的子類型“五角形”,而並不需要修改處理泛化幾何形狀的方法。通過導出新的子類型而輕鬆擴展設計的能力是對改動進行封裝的基本方法之一。這種能力可以極大地改善我們的設計,同時也降低軟件維護的代價。
  但是,在試圖將導出類型的對象當作其泛化基類型對象看待時(把圓形看作是幾何形,把自行車看作是交通工具,把鸕鶿看作是鳥等等),仍然存在一個問題。如果某個方法要泛化幾何形狀繪製自己、讓泛化交通工具行駛,或者讓泛化的鳥類移動,那麼編譯器在編譯時是不可能知道應該執行哪一段代碼的。這就是關鍵所在:當發送這樣的消息時,程序員並不想知道哪一段代碼將被執行;繪圖方法可以被等同位地應用於圓形、正方形、三角形,而對象會依據自己的具體類型來執行恰當的代碼。
  如果不需要知道哪一段代碼會被執行,那麼當添加新的子類型時,不需要更改調用它的方法,它就能夠執行不同的代碼。因此,編譯器無法精確地瞭解哪一段代碼將會被執行,那麼它該怎麼辦呢?例如,在下面的圖中,BirdController對象僅僅處理泛化的Bird對象,而不瞭解它們的確切類型。從BirfController的角度看,這麼做非常方便,因爲不需要編寫特別的代碼來判定要處理的Bird對象的確切類型或其行爲。當move()方法被調用時,即便忽略Bird的具體類型,也會產生正確的行爲(Goose(鵝)走、飛或游泳,Penguin(企鵝)走或游泳),那麼,這是如何發生的呢?
  html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章