1. 程式人生 > >面向介面程式設計 與 多型 通俗易懂的解釋(轉載自知乎)

面向介面程式設計 與 多型 通俗易懂的解釋(轉載自知乎)

說“空話”,做實事: 談談多型

原出處 劉欣公眾號 碼農翻身

最近有初學者問多型有什麼用, 思考了一下,就有了這篇文章。

1 什麼是多型?

多型是碼農們必須要理解理解的一個基本思想, 是面向物件的基石。

但是很多人(包括我)第一次接觸多型時都會困惑: 這東西有什麼用處?

多型的例子在Java裡非常簡單,每個初學者都會遇到:

這沒什麼啊, 不就是把Apple這個類的例項賦值給Fruit 這個抽象類, 然後當我們呼叫相關方法的時候實際執行的是Apple這個類的方法, 而不是Fruit的方法。

何必要多此一舉呢? 為什麼要把一個子類的例項賦值給一個父類呢? 沒必要啊,直接一點多好:

Apple a = new Apple();

a.getPrice() --> 返回5.0f

a.getName() --> 返回 “Apple”

沒錯,在這個小例子中, 我們完全可以這麼幹。

2 沒有多型的世界

現在假設程式設計世界沒有多型, 我們沒法使用它。 對於上面的例子, 引入兩個新的類, 橙子(Orange) 和購物車(ShopCart):

注意: Apple 和Orange 沒有共同的父類Fruit了, 並且Orange類獲取價格的方法是getUnitPrice(), 和Apple類的不一樣。

購物車可以新增蘋果和橙子, 並且有個計算總價格的方法 : calculateTotalPrice。

在該方法中, 需要判斷每個物件是什麼型別, 然後呼叫不同的方法。

要是新加一個香蕉類, 不但需要新加一個addBanana()的方法, 還得小心的修改計算總價的方法: 找到相應的地方新增一個分支專門處理香蕉類。

是不是很痛苦?

3 請回多型

現在應該能看出抽象類Fruit的作用了, 如果Apple, Orange 都實現了Fruit, 那購物車就變的異常簡單:

現在想一想: 為什麼購物車類能變得簡單而清晰?

因為ShopCart 面對的是一個抽象的概念: Fruit , 而不是具體的實現 Apple, Orange, Banana...

它不用關心那些煩人的細節, 只要針對Fruit程式設計就好。

為什麼ShopCart能對Fruit這個抽象的“介面” 進行程式設計呢? 背後肯定是多型在起作用了! 原來你在這裡 !

這就是我想表達的 說“空話", 做實事的意思, 抽象類/介面實際上在說“空話”, 而真正做實際事情的是具體的實現類。

但是想說“空話”也得有個載體才行,這個載體就是抽象的概念 Fruit !

4 思考

現在我們應該知道抽象的威力了, 一個好的抽象(Fruit) 能夠讓程式碼變的無比簡潔。

《設計模式》一書中反覆強調的 “針對介面程式設計,而不是實現程式設計” 就是這個意思。

可是問題來了: 怎麼才能抽象出好的概念呢?

上面的例子很簡單, 並且在現實中也有相關的術語,所以很容易得出Fruit這樣的概念。

如果是一個大系統, 那就會難的多, 很多時候需要抽象出的概念在現實中並沒有對應物, 這就很考驗設計者的功力了, 也是面向物件分析和設計比較難的地方 , 需要經驗的積累和大量的實踐才行。