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

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


咨詢
建站咨詢
