虛擬函數(shù)實(shí)例展示
時(shí)間:2023-03-26 13:00:01 | 來源:營(yíng)銷百科
時(shí)間:2023-03-26 13:00:01 來源:營(yíng)銷百科
虛擬函數(shù)實(shí)例展示:下面通過一個(gè)簡(jiǎn)單的實(shí)例來展示這一優(yōu)點(diǎn)。
假設(shè)有一個(gè)繪圖程序允許用戶在一個(gè)畫布上繪制各種圖形,如三角形、矩形和圓等,很自然地抽象圖形的繼承體系,如圖2-2所示。
這個(gè)圖形繼承體系的設(shè)計(jì)大致如下:
為簡(jiǎn)單起見,讓每個(gè)Shape對(duì)象都支持'繪制'和'旋轉(zhuǎn)'操作,每個(gè)Shape的派生類對(duì)這兩個(gè)操作都有自己的實(shí)現(xiàn):
再來考慮這個(gè)圖形繼承體系的使用,這里很自然的一個(gè)使用者是畫布,設(shè)計(jì)其類名為'Canvas':
Canvas類中維護(hù)一個(gè)包含所有圖形的shapes,Canvas類在處理自己的業(yè)務(wù)邏輯時(shí)并不關(guān)心shapes實(shí)際上都是哪些具體的圖形;相反,如①處和②處所示,它只將這些圖形作為一個(gè)抽象,即Shape。在處理每個(gè)Shape時(shí),調(diào)用每個(gè)Shape的某個(gè)操作即可。
這樣做的一個(gè)好處是當(dāng)圖形繼承體系發(fā)生變化時(shí),作為圖形繼承體系的使用者Canvas而言,它的改變幾乎沒有,或者很小。
比如說,在程序的演變過程中發(fā)現(xiàn)需要支持多邊型(Polygon)和貝塞爾曲線(Bezier)類型,只需要在圖形繼承體系中增加這兩個(gè)新類型即可:
而不必修改Canvas的任何代碼,程序即可像以前那樣正常運(yùn)行。同理,如果以后發(fā)現(xiàn)不再支持某種類型,也只需要將其從圖形繼承體系中刪除,而不必修改Canvas的任何代碼??梢钥吹?,從對(duì)象繼承體系的使用者(Canvas)的角度來看,它只看到Shape對(duì)象,而不必關(guān)心到底是哪一種特定的Shape,這是面向?qū)ο笤O(shè)計(jì)的一個(gè)重要特點(diǎn)和優(yōu)點(diǎn)。
關(guān)鍵詞:展示,實(shí)例,函數(shù),虛擬