freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

面向?qū)ο缶幊淘瓌tppt課件(編輯修改稿)

2025-02-13 19:33 本頁面
 

【文章內(nèi)容簡介】 鳥類派生,鳥類所有的特性和行為都被鴕鳥類繼承。大多數(shù)的鳥類在人們的印象中都是會(huì)飛的,所以,我們給鳥類設(shè)計(jì)了一個(gè)名字為 fly的方法,還給出了與飛行相關(guān)的一些屬性 ,比如飛行速度( velocity)。 鳥類 Bird: class Bird { double velocity。 public : ? void fly() { //I am flying。 }。 ? void setVelocity(double velocity) { = velocity。 }。 double getVelocity() { return 。 }。 } 鴕鳥不會(huì)飛怎么辦?我們就讓它扇扇翅膀表示一下吧,在 fly方法里什么都不做。至于它的飛行速度,不會(huì)飛就只能設(shè)定為 0了,于是我們就有了鴕鳥類的設(shè)計(jì)。 鴕鳥類 Ostrich: class Ostrich :public Bird { public fly() { //I do nothing。 }。 public setVelocity(double velocity) { = 0。 }。 public getVelocity() { return 0。 }。 } 深藍(lán)軟件 鴕鳥不是鳥 ? 好了,所有的類都設(shè)計(jì)完成,我們把類 Bird提供給了其它的代碼(消費(fèi)者)使用?,F(xiàn)在,消費(fèi)者使用 Bird類完成這樣一個(gè)需求:計(jì)算鳥飛越黃河所需的時(shí)間。 對于 Bird類的消費(fèi)者而言,它只看到了 Bird類中有 fly和 getVelocity兩個(gè)方法,至于里面的實(shí)現(xiàn)細(xì)節(jié),它不關(guān)心,而且也無需關(guān)心,于是給出了實(shí)現(xiàn)代碼: 測試類 TestBird: class TestBird { public: void calcFlyTime(Bird bird) { try{ double riverWidth = 3000。 cout.riverWidth / ()endl。 } catch(…){ coutAn error occured!endl 。 } }。 } 深藍(lán)軟件 鴕鳥不是鳥 ? 如果我們拿一種飛鳥來測試這段代碼,沒有問題,結(jié)果正確,符合我們的預(yù)期,系統(tǒng)輸出了飛鳥飛越黃河的所需要的時(shí)間;如果我們再拿鴕鳥來測試這段代碼,結(jié)果代碼發(fā)生了系統(tǒng)除零的異常,明顯不符合我們的預(yù)期。 對于 TestBird類而言,它只是 Bird類的一個(gè)消費(fèi)者,它在使用 Bird類的時(shí)候,只需要根據(jù) Bird類提供的方法進(jìn)行相應(yīng)的使用,根本不會(huì)關(guān)心鴕鳥會(huì)不會(huì)飛這樣的問題,而且也無須知道。它就是要按照“所需時(shí)間 = 黃河的寬度 / 鳥的飛行速度”的規(guī)則來計(jì)算鳥飛越黃河所需要的時(shí)間。 我們得出結(jié)論:在 calcFlyTime方法中, Bird類型的參數(shù)是不能被 Ostrich類型的參數(shù)所代替,如果進(jìn)行了替換就得不到預(yù)期結(jié)果。因此, Ostrich類和 Bird類之間的繼承關(guān)系違反了里氏代換原則,它們之間的繼承關(guān)系不成立,鴕鳥不是鳥。 深藍(lán)軟件 鴕鳥到底是不是鳥 ? ? “鴕鳥到底是不是鳥”,鴕鳥是鳥也不是鳥,這個(gè)結(jié)論似乎就是個(gè)悖論。產(chǎn)生這種混亂有兩方面的原因: ? 原因一:對類的繼承關(guān)系的定義沒有搞清楚。 面向?qū)ο蟮脑O(shè)計(jì)關(guān)注的是對象的行為,它是使用“行為”來對對象進(jìn)行分類的,只有行為一致的對象才能抽象出一個(gè)類來。 類的繼承關(guān)系就是一種“ IsA”關(guān)系,實(shí)際上指的是行為上的“ IsA”關(guān)系,可以把它描述為“ ActAs”。 我們再來看“正方形不是長方形”這個(gè)例子,正方形在設(shè)置長度和寬度這兩個(gè)行為上,與長方形顯然是不同的。長方形的行為:設(shè)置長方形的長度的時(shí)候,它的寬度保持不變,設(shè)置寬度的時(shí)候,長度保持不變。正方形的行為:設(shè)置正方形的長度的時(shí)候,寬度隨之改變;設(shè)置寬度的時(shí)候,長度隨之改變。所以,如果我們把這種行為加到基類長方形的時(shí)候,就導(dǎo)致了正方形無法繼承這種行為。我們“強(qiáng)行”把正方形從長方形繼承過來,就造成無法達(dá)到預(yù)期的結(jié)果。 “鴕鳥非鳥”基本上也是同樣的道理。我們一講到鳥,就認(rèn)為它能飛,有的鳥確實(shí)能飛,但不是所有的鳥都能飛。問題就是出在這里。如果以“飛”的行為作為衡量“鳥”的標(biāo)準(zhǔn)的話,鴕鳥顯然不是鳥;如果按照生物學(xué)的劃分標(biāo)準(zhǔn):有翅膀、有羽毛等特性作為衡量“鳥”的標(biāo)準(zhǔn)的話,鴕鳥理所當(dāng)然就是鳥了。鴕鳥沒有“飛”的行為,我們強(qiáng)行給它加上了這個(gè)行為,所以在面對“飛越黃河”的需求時(shí),代碼就會(huì)出現(xiàn)運(yùn)行期故障。 深藍(lán)軟件 鴕鳥到底是不是鳥 ? ? 原因二:設(shè)計(jì)要依賴于用戶要求和具體環(huán)境。 繼承關(guān)系要求子類要具有基類全部的行為。這里的行為是指落在需求范圍內(nèi)的行為。圖中鳥類具有 4個(gè)對外的行為,其中 2個(gè)行為分別落在 A和 B系統(tǒng)需求中: 系統(tǒng)需求和對象關(guān)系示意圖 深藍(lán)軟件 ? A需求期望鳥類提供與飛翔有關(guān)的行為,即使鴕鳥跟普通的鳥在外觀上就是 100%的相像,但在 A需求范圍內(nèi),鴕鳥在飛翔這一點(diǎn)上跟其它普通的鳥是不一致的,它沒有這個(gè)能力,所以,鴕鳥類無法從鳥類派生,鴕鳥不是鳥。 B需求期望鳥類提供與羽毛有關(guān)的行為,那么鴕鳥在這一點(diǎn)上跟其它普通的鳥一致的。雖然它不會(huì)飛,但是這一點(diǎn)不在 B需求范圍內(nèi),所以,它具備了鳥類全部的行為特征,鴕鳥類就能夠從鳥類派生,鴕鳥就是鳥。 ? 所有派生類的行為功能必須和使用者對其基類的期望保持一致,如果派生類達(dá)不到這一點(diǎn),那么必然違反里氏替換原則。在實(shí)際的開發(fā)過程中,不正確的派生關(guān)系是非常有害的。伴隨著軟件開發(fā)規(guī)模的擴(kuò)大,參與的開發(fā)人員也越來越多,每個(gè)人都在使用別人提供的組件,也會(huì)為別人提供組件。最終,所有人的開發(fā)的組件經(jīng)過層層包裝和不斷組合,被集成為一個(gè)完整的系統(tǒng)。每個(gè)開發(fā)人員在使用別人的組件時(shí),只需知道組件的對外裸露的接口,那就是它全部行為的集合,至于內(nèi)部到底是怎么實(shí)現(xiàn)的,無法知道,也無須知道。所以,對于使用者而言,它只能通過接口實(shí)現(xiàn)自己的預(yù)期,如果組件接口提供的行為與使用者的預(yù)期不符,錯(cuò)誤便產(chǎn)生了。里氏代換原則就是在設(shè)計(jì)時(shí)避免出現(xiàn)派生類與基類不一致的行為。 深藍(lán)軟件 如何正確地運(yùn)用里氏代換原則 ? 里氏代換原則目的就是要保證繼承關(guān)系的正確性。我們在實(shí)際
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1