不是抽象類的基類不是好基類-創(chuàng)新互聯(lián)

開宗明義:不是抽象類的基類不是好基類。為什么這么說?

我們注重客戶提出的每個要求,我們充分考慮每一個細節(jié),我們積極的做好網(wǎng)站制作、成都網(wǎng)站設(shè)計服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)公司贏得了業(yè)內(nèi)的良好聲譽,這一切,也不斷的激勵著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計,小程序定制開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。

基類和派生類的關(guān)系有如下幾種:

不是抽象類的基類不是好基類

基類可以是具體類、虛類和抽象類三種,對派生類沒有要求。其中具體類是沒有虛函數(shù)的類,其所有方法都提供了具體實現(xiàn);派生類方法如果和基類方法同名,則派生類方法隱藏(overwrite)了基類方法。虛類是包含虛函數(shù)的類,所有方法都提供具體實現(xiàn);派生類如果要提供不同于基類虛方法的實現(xiàn),則在派生類中提供同名方法,該方法將覆蓋(override)基類虛方法。抽象類是包含抽象方法(或稱為純虛方法)的類,抽象方法不提供具體實現(xiàn),抽象類只用于表示概念,不能直接構(gòu)造抽象類的對象,抽象類的極端化就是“接口”。


首先,從語義上理解。

派生類和基類一定要滿足“is-a”關(guān)系,即派生類和基類有類屬關(guān)系,或者說派生類是基類的一種具體化?;惐硎灸撤N概念,派生類表示該概念下的某類具體事物。

讓一個類繼承自另一個具體類明顯是不合理的,即使他們表示的概念很相近,或者他們的關(guān)系很緊密,這相當(dāng)于說事物A是一種事物B。比如讓直升機繼承自固定翼飛機,明顯,直升機并不是一種固定翼飛機,雖然它們有“fly”這個方法。正確的抽象方式是,提取出飛機這個概念作為基類,然后讓直升機和固定翼飛機都從基類飛機繼承。

不是抽象類的基類不是好基類

讓派生類從虛類繼承也是不合理的,卻是常見的錯誤思路,在很多OOP入門教材上用濫了的例子。即,虛基類提供默認實現(xiàn),如果派生類的行為和基類不同,則在派生類中覆蓋基類虛方法。

其實,由于虛基類提供了所有方法的實現(xiàn),說明虛基類并不虛,是一個表示具體事物的具體類。在語義上的問題,同樣可以用前述例子來說明。


其次,從程序設(shè)計角度理解。

讓派生類繼承自具體基類的動機在于,派生類的某些行為和具體基類相同,派生類想要重用基類的這部分代碼。而在另一些行為上派生類和基類又有差別,于是在派生類實現(xiàn)了和基類同名的方法(為了保持接口一致,所以同名)來定義自己的行為。從虛基類獲得派生類的動機同上,同時還享受了多態(tài)性的好處。

但是上述方式的問題在于:

1、沒有遵循“依賴倒置”原則,應(yīng)對變化的能力不足。OO設(shè)計里的一條重要原則就是:針對抽象編程,而不是針對具體對象編程,這條原則也叫做“依賴倒置”原則?;惓洚?dāng)了類繼承樹和外部世界之間的界面角色,用戶通過基類接口使用這個類繼承樹。如果用具體基類或虛基類作為界面,當(dāng)類繼承樹內(nèi)部發(fā)生變化時,就會影響到用戶代碼,可能要求用戶代碼修改或者重新編譯。

2、可能造成代碼重復(fù)。假設(shè)派生類重新實現(xiàn)了基類的方法foo,其他方法都相同。如果派生類::foo的實現(xiàn)和基類::foo完全不同,正說明了派生類和基類并沒有類屬關(guān)系,而是在概念上和基類處于同一層次的另一事物。如果派生類::foo的實現(xiàn)和基類::foo相似,只是細節(jié)不同,那么它們中必然存在大量實現(xiàn)相同功能的代碼,這違反了同一份數(shù)據(jù)或代碼只出現(xiàn)一次的要求,正是bug的主要來源之一;解決方法是提取出抽象類,運用模板方法(template method)模式。

還是以飛機的例子來說明。

不是抽象類的基類不是好基類

方案一,直升機和固定翼飛機的飛行方式完全不同,所以直升機::fly需要完全重新改寫固定翼飛機::fly,在概念和實現(xiàn)上都是urgly的。于是有方案二:

不是抽象類的基類不是好基類

方案二,提取抽象類飛機,定義抽象方法fly,然后在其派生類固定翼飛機和直升機中分別實現(xiàn)fly方法。

現(xiàn)在變化來了,要將陸基戰(zhàn)斗機和艦載戰(zhàn)斗機加入這個體系結(jié)構(gòu)中。我們知道,陸基和艦載飛機在在空中的飛行方式是一樣的,不同的是艦載機在起飛和降落時有特殊要求。這意味著,陸基戰(zhàn)斗機和艦載戰(zhàn)斗機可以重用固定翼飛機::fly方法的大部分代碼。
不是抽象類的基類不是好基類

方案三,運用模板方法模式,將飛機起飛方式作為抽象方法,將固定翼飛機提取為抽象類,在陸基戰(zhàn)斗機和艦載戰(zhàn)斗機中分別實現(xiàn)起飛方法。飛機類和固定翼飛機類都成為了抽象類。

那么,如果按照從具體基類或虛基類發(fā)展類繼承體系的思路,最后將會得到什么樣的設(shè)計呢?很可能是下面這樣的。
不是抽象類的基類不是好基類

固定翼飛機::fly實現(xiàn)陸基飛行方法;艦載戰(zhàn)斗機::fly實現(xiàn)copy固定翼飛機::fly的大部分代碼,然后添加艦載起飛方式;直升機::fly完全重寫fly方法。它還是可以工作的,不過概念不清,可擴展性差。


結(jié)論:

1、如果以具體類或者虛類作為基類,說明抽象得還不夠,概念沒理清,對象模型需要進一步分析,提取出抽象基類。

2、如果基類和派生類的同名方法實現(xiàn)完全不同,則將此同名方法作為抽象類的抽象方法;如果上述同名方法實現(xiàn)部分相似,則運用模板方法模式設(shè)計。

最終得到的類繼承樹中,所有的葉子節(jié)點都是且僅是具體類,根節(jié)點和所有中間節(jié)點都是且僅是抽象類。如下圖:
不是抽象類的基類不是好基類


不是抽象類的基類不是好基類!**

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

網(wǎng)站名稱:不是抽象類的基類不是好基類-創(chuàng)新互聯(lián)
文章分享:http://muchs.cn/article46/dpsohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、域名注冊、品牌網(wǎng)站建設(shè)企業(yè)建站、企業(yè)網(wǎng)站制作Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計