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

正文內(nèi)容

第四章面向?qū)ο蟪绦蛟O(shè)計語言-資料下載頁

2024-09-01 08:15本頁面

【導(dǎo)讀】是行為(操作)和(約束)。但最早見諸文獻是sketchpad提到的OO. 60年代挪威的Dahl和Nyard為模擬系統(tǒng)研制了SIMULA-67語言,首先提出封裝的類和動態(tài)生成實例對象的概念。中心參加了Dynabook項目。該項目的硬件是Star. 經(jīng)過-76-80兩次改進,Smalltalk-80成為向外發(fā)行的正式版本。用戶就是按瀏覽窗中顯示的模板填寫程序。treeclass消息class發(fā)向tree,得到tree的類。3+4消息‘+‘帶參數(shù)4發(fā)向?qū)ο?,得對象7。數(shù)組第4元素與‘foo‘同名。假’塊執(zhí)行]―可以不出現(xiàn)”。間語言編寫,由Smalltalk虛機解釋執(zhí)行。統(tǒng)管理三種文件:源文件、變更文件、映象文件。

  

【正文】 現(xiàn) ? 對數(shù)據(jù)抽象和面向?qū)ο蠹夹g(shù)的支持,以及高效的實現(xiàn),使實際軟件工作者看到了 C++(和 OO)的潛力,最終導(dǎo)致了面向?qū)ο蟮母锩? ? 以后的主流面向?qū)ο笳Z言也都采用了這種技術(shù)。當(dāng)然,采用這種選擇,也就對它們可能采用的對象模型提出了嚴(yán)格的限制 ? Pragmatics 里還討論了其他高效實現(xiàn)方法,《 C++ 語言的設(shè)計與演化》里也有討論(通過幾條指令構(gòu)成的一段 “ 蹦床代碼 ” ,將控制轉(zhuǎn)到實際應(yīng)該調(diào)用的方法,主要是要解決多重繼承問題) 虛方法(動態(tài)約束方法)的一個重要缺點是不能做 inline 處理(在線展開要求靜態(tài)確定被調(diào)用的方法),使編譯器難以進行跨過程的代碼優(yōu)化 C++ 希望支持高效的系統(tǒng)程序設(shè)計,認(rèn)為虛方法帶來的效率損失有時也是不能容忍的,因此它同時支持靜態(tài)方法約束 注意:如果一個類里只有靜態(tài)約束的方法,該類編譯之后就不會生成方法表,該類的對象也沒有一個指針的額外存儲開銷 類層次結(jié)構(gòu)和強制轉(zhuǎn)換 ? 向上強制總是安全的,不會出問題,總可以自動進行。因為派生類包含基類所有數(shù)據(jù)成分,因此可以支持基類所有操作 ? 后一個賦值是編譯時錯誤,派生類指針不能引用基類對象 類層次結(jié)構(gòu)和強制轉(zhuǎn)換 ? 如果用 foo 類的指針 q 傳遞一個對象 ? 可保證該對象一定是 foo 的或它的某個派生類的對象 ? 如果由 foo 類指針 q 傳遞的實際上是一個 bar 對象,我們有時需要把它作為 bar 對象使用,例如想對它調(diào)用 foo 里沒有的方法 – qs(..) 是靜態(tài)類型錯誤( q 的指向類型是 foo, foo 無方法 s) – s = q 也是靜態(tài)類型錯(不能保證 q 指向的是 bar,賦值不安全) 能不能用 s = (bar*)q ? ? 如果 q 指向的確實是一個 bar 對象,當(dāng)前情況下恰好可以,因為 – (bar*) 對指針是 “非變換轉(zhuǎn)換 ”,導(dǎo)致把 foo 指針當(dāng)做 bar 指針 – 恰好 bar 對象的起始位置和各成分的偏移量與 foo 一樣 這些條件有時不成立(下面會看到,在存在多重繼承時) 這種轉(zhuǎn)換不安全,它要求 q 指向的確實是 bar。動態(tài)怎么檢查類型? 類層次結(jié)構(gòu)和強制轉(zhuǎn)換 ? C++ 為安全的向下強制轉(zhuǎn)換提供了專門運算符 dynamic_cast。上述轉(zhuǎn)換的正確寫法: bar *x = dynamic_castbar*(q)。 ? 如果 q 指向的確實是 bar 類的對象,轉(zhuǎn)換將成功, x 指向該 bar 類對象 ? 如果 q 指向的不是 bar 類的對象,轉(zhuǎn)換失敗, x 被賦空指針值 0 ? 通過檢查 x 的值,可以判斷轉(zhuǎn)換是否成功 實現(xiàn) dynamic_cast,就要求在運行中能判斷對象的類型和類型間關(guān)系 這就是運行時類型識辨( Run Time Type Identification, RTTI) 要像支持安全的向下轉(zhuǎn)換, C++ 的實現(xiàn)需要在 虛表里增加一個類描述符 ? 常放在虛表最前。一些 C++ 編譯器要求用戶指明需要用 RTTI,在這種情況下才按這種方式創(chuàng)建虛表(虛表的形式與沒有類描述符時不同) ? dynamic_cast 檢查類型關(guān)系,確定能否轉(zhuǎn)換,在能轉(zhuǎn)換就完成轉(zhuǎn)換 類層次結(jié)構(gòu)和強制轉(zhuǎn)換 多數(shù) OO 語言(如 Java 等)默認(rèn)支持 RTTI,虛表里總保存類描述符 ? 如何描述類型是編譯器的具體實現(xiàn)問題,不必關(guān)心 ? RTTI 機制可保證類型安全的轉(zhuǎn)換 雖然 Java 的類型轉(zhuǎn)換采用 C 語言類型轉(zhuǎn)換的描述形式,但功能不同 ? 在牽涉到基本類型時,可能需要做值的轉(zhuǎn)換 ? 在牽涉到類類型時,需要做動態(tài)的類型轉(zhuǎn)換合法性檢查 – 如果發(fā)現(xiàn)錯誤,就拋出異常 ClassCastException – 否則做 “非變換類型轉(zhuǎn)換 ”,把相應(yīng)引用直接當(dāng)作所需的類型的引用 ? 從基本類型值到類類型的合法轉(zhuǎn)換,還需要自動構(gòu)造對象( boxing);從類對象到基本類型值的轉(zhuǎn)換需要提取對象內(nèi)的值( unboxing) 運行時類型描述機制還被用于支持 “自反 ”( reflection)功能 Ada 的面向?qū)ο髾C制 ?定義類和實例對象 Ada95以抽象數(shù)據(jù)類型實現(xiàn)類。類的封裝性由包實現(xiàn),類的繼承性則擴充了標(biāo)簽( tag)類型和抽象類型,標(biāo)簽類型只限記錄類型。類的繼承性利用了Ada8的類型派生機制實現(xiàn)子類。 package Object is type Object is tagged 此類型的數(shù)據(jù)即對象的屬性 record 無 tagged即一般的 ADT, 有它是為了類繼承 X_Coord: Float: =0; Y_Coord: Float: =0 初值為缺省時用 end record; function Distance ( O: Object) return Float; Object對象的行為 function Area( O: Object) return Float; end Object with Object, use Object; package Shapes is 這個包封裝了三個子類(型) type Point is new Object with null record; 只繼承不擴充的子類 type Circle is new Object with 繼承并擴充此屬性 record Radius: Float; end record; function Area( C: Circle) return Float; 覆蓋 Object中的 Area type Triangle is new Object with –繼承并 record A, B, C: Float; 擴充三個屬性 end record; function Area ( T: Triangle) return Float; 覆蓋 end Shape; 這些類(型)包外可見(可輸出),在主子程序中聲明實例,如同類型聲明變量,以初值表達(dá)式作值構(gòu)造子: 子類的實例 也是父類的實例 O: Object: P: Point; 聲明實例對象 P:( O with null record); C: Cirele: =( , , ); C: =( O with ); T; Triangle: =( , , ); T: =( O with , , ); 如果動態(tài)生成實例,可將此聲明放在類的方法(過程 /函數(shù))中,調(diào)用時生成 。 ?以類寬類型實現(xiàn)多態(tài) Ada95的每個標(biāo)簽類型都有一個與之對應(yīng)的類類型屬性 T’ Class,并把它叫做類寬類型( Class Wide Type) 設(shè)已聲明 T類型 , 及 T‘Class的變量 V, 則 Y: T; 一般聲明 , 正確 Y: T‘Class。 不可以 Y: T‘Class: =V。 可以 , T‘Class束定為 V的類型 類寬類型的范圍示意如下: TAA AB ACCABCBCACBA類(型)T的繼承樹CA39。ClassCA39。ClassCAB39。ClassT39。Classprocedure Process_Reservation ( Rc: in out Reservation‘Class) is 形參可以是類寬類型,不必最初束定某特定類型 begin … Make( Rc) 。 它按相結(jié)合的 Rc的具體類型出票 … end Process_Reservation; 這個程序在編譯時 Make是沒有也無法束定到某 make函數(shù) 體上,只有在 運行中(動態(tài))束定,束定時按 Rc對應(yīng)的實參的標(biāo)簽 tag值派送,編譯時只要 做出派送表 ?擴充程序包機制實現(xiàn)繼承的類體系 Ada 95增設(shè)了子輩單元( child unit)和私有子輩單元。 子輩單元 package is ??后是子輩單元名 type Supersonic_Reservation is new Reservation with private; private type Supersonic_Reservation is new Reservation with record Champagne: Vintage; …… end record; procedure Make( Sr: in out Supersonic_Reservation); procedure Select_Seat( Sr: in out Supersonic_Reservation); …… end ; ?私有子輩單元 package OS is 父包 OS OS 的可見成份 type File_Descriptor is private; … private type File_Descriptor is new Integer; end OS; package is –OS的子輩程序包 File_Descriptor_Error, File_Name_Error, Permission_Error: exception; 所定義異常 OS各子輩包均可用 end ; 公有,但不涉及泄露 with ; with ; package is –OS的子輩程序包 type File_Mode is ( Read_Only, Write_Only, Read_Write) ; function Open( File_Name: String; Mode; File_Mode) return File_Descriptor; procedure Close ( File: in File_Descriptor) ; … end ; 公有 , 只用私有類型 。 也無泄露 with ; procedure ( Command: String); 命令解釋過程 ,等同子包 private package is –私有子輩程序包 , 不用 with … end ; private package is —OS的私有子輩程序包 … end ; Ada的多繼承 with Abstract_Sets; package Linked_Sets is type Linked_Set is new Abstruct_Sets with private; 再定義 Linked_Set的各種操作 private type Cell; type Cell_Ptr is access Cell; type Cell is record E: Element; next: Cell_Ptr; end record function Copy( P: Cell_Ptr) return Cell_Ptr; type lnner is new Cont
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1