新聞中心
1.什么是多態(tài)?

成都創(chuàng)新互聯(lián)專注于灌陽網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供灌陽營銷型網站建設,灌陽網站制作、灌陽網頁設計、灌陽網站官網定制、小程序定制開發(fā)服務,打造灌陽網絡公司原創(chuàng)品牌,更為您提供灌陽網站排名全網營銷落地服務。
多態(tài)是碼農們必須要理解理解的一個基本思想, 是面向對象的基石。
但是很多人(包括我)***次接觸多態(tài)時都會困惑: 這東西有什么用處?
多態(tài)的例子在Java里非常簡單,每個初學者都會遇到:
這沒什么啊, 不就是把Apple這個類的實例賦值給Fruit 這個抽象類, 然后當我們調用相關方法的時候實際執(zhí)行的是Apple這個類的方法, 而不是Fruit的方法。
何必要多此一舉呢? 為什么要把一個子類的實例賦值給一個父類呢? 沒必要啊,直接一點多好:
- Apple a = new Apple();
- a.getPrice() --> 返回5.0f
- a.getName() --> 返回 “Apple”
沒錯,在這個小例子中, 我們完全可以這么干。
2.沒有多態(tài)的世界
現(xiàn)在假設編程世界沒有多態(tài), 我們沒法使用它。 對于上面的例子, 引入兩個新的類, 橙子(Orange) 和購物車(ShopCart):
注意: Apple 和Orange 沒有共同的父類Fruit了, 并且Orange類獲取價格的方法是getUnitPrice(), 和Apple類的不一樣。
購物車可以添加蘋果和橙子, 并且有個計算總價格的方法 : calculateTotalPrice。
在該方法中, 需要判斷每個對象是什么類型, 然后調用不同的方法。
要是新加一個香蕉類, 不但需要新加一個addBanana()的方法, 還得小心的修改計算總價的方法: 找到相應的地方添加一個分支專門處理香蕉類。
是不是很痛苦?
3.請回多態(tài)
現(xiàn)在應該能看出抽象類Fruit的作用了, 如果Apple, Orange 都實現(xiàn)了Fruit, 那購物車就變的異常簡單:
現(xiàn)在想一想: 為什么購物車類能變得簡單而清晰?
因為ShopCart 面對的是一個抽象的概念: Fruit , 而不是具體的實現(xiàn) Apple, Orange, Banana...
它不用關心那些煩人的細節(jié), 只要針對Fruit編程就好。
為什么ShopCart能對Fruit這個抽象的“接口” 進行編程呢? 背后肯定是多態(tài)在起作用了! 原來你在這里 !
這就是我想表達的 說“空話", 做實事的意思, 抽象類/接口實際上在說“空話”, 而真正做實際事情的是具體的實現(xiàn)類。
但是想說“空話”也得有個載體才行,這個載體就是抽象的概念 Fruit !
4.思考
現(xiàn)在我們應該知道抽象的威力了, 一個好的抽象(Fruit) 能夠讓代碼變的無比簡潔。
《設計模式》一書中反復強調的 “針對接口編程,而不是實現(xiàn)編程” 就是這個意思。
可是問題來了: 怎么才能抽象出好的概念呢?
上面的例子很簡單, 并且在現(xiàn)實中也有相關的術語,所以很容易得出Fruit這樣的概念。
如果是一個大系統(tǒng), 那就會難的多, 很多時候需要抽象出的概念在現(xiàn)實中并沒有對應物, 這就很考驗設計者的功力了, 也是面向對象分析和設計比較難的地方 , 需要經驗的積累和大量的實踐才行。
【本文為專欄作者“劉欣”的原創(chuàng)稿件,轉載請通過作者微信公眾號coderising獲取授權】
網站名稱:說“空話”,做實事:談談多態(tài)
地址分享:http://m.jiaoqi3.com/article/cojspcd.html


咨詢
建站咨詢
