Kirk Pepperdine

多型的真正價值#

**Polymorphism(多型)**是物件導向程式設計的核心概念之一。這個詞源自希臘文,意為「多種形態」(poly = 多,morph = 形態)。在程式設計中,多型指的是某個類別的物件或方法可以有多種形式。

但多型不僅僅是替代實作。善加運用時,多型能創造微小的局部執行情境(localized execution contexts),讓我們不再需要冗長的 if-then-else 區塊:

  • 在情境之內,我們可以直接做正確的事
  • 在情境之外,我們被迫重建情境,才能做正確的事

購物車範例#

以一個簡單的購物車為例,網路商店販售可下載的商品和需要寄送的商品。結帳時需要出貨:

while (!cart.isEmpty()) {
    shipping.ship(cart.takeNext(), ???);
}

這裡的 ??? 就是問題所在——我們需要知道該用 email 還是實體郵寄。傳統做法可能用 booleanenumif-then-else 來判斷。

多型的解法#

更好的做法是讓 Item 成為介面,由 DownloadableItemSurfaceItem 各自實作 ship 方法:

  • DownloadableItem 知道自己要透過 email 寄送
  • SurfaceItem 知道自己要用實體地址寄送

這樣每個物品自己知道如何被出貨,不需要外部的 if-then-else 判斷。

相關模式#

這個範例展示了兩個常常搭配使用的設計模式:

  • Command(命令模式)
  • Double Dispatch(雙重分派)

衡量錯失多型機會的簡單方法:計算程式碼中 if-then-else 語句的數量。雖然有些情況下使用 if-then-else 更實際,但通常採用多型風格的程式碼會更小、更易讀、更不脆弱。