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

正文內(nèi)容

第四章面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(參考版)

2024-09-05 08:15本頁(yè)面
  

【正文】 也無泄露 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。 子輩單元 package is ?Classprocedure Process_Reservation ( Rc: in out Reservation‘Class) is 形參可以是類寬類型,不必最初束定某特定類型 begin … Make( Rc) 。ClassCAB39。 可以 , T‘Class束定為 V的類型 類寬類型的范圍示意如下: TAA AB ACCABCBCACBA類(型)T的繼承樹CA39。 ?以類寬類型實(shí)現(xiàn)多態(tài) Ada95的每個(gè)標(biāo)簽類型都有一個(gè)與之對(duì)應(yīng)的類類型屬性 T’ Class,并把它叫做類寬類型( Class Wide Type) 設(shè)已聲明 T類型 , 及 T‘Class的變量 V, 則 Y: T; 一般聲明 , 正確 Y: T‘Class。類的繼承性利用了Ada8的類型派生機(jī)制實(shí)現(xiàn)子類。一些 C++ 編譯器要求用戶指明需要用 RTTI,在這種情況下才按這種方式創(chuàng)建虛表(虛表的形式與沒有類描述符時(shí)不同) ? dynamic_cast 檢查類型關(guān)系,確定能否轉(zhuǎn)換,在能轉(zhuǎn)換就完成轉(zhuǎn)換 類層次結(jié)構(gòu)和強(qiáng)制轉(zhuǎn)換 多數(shù) OO 語(yǔ)言(如 Java 等)默認(rèn)支持 RTTI,虛表里總保存類描述符 ? 如何描述類型是編譯器的具體實(shí)現(xiàn)問題,不必關(guān)心 ? RTTI 機(jī)制可保證類型安全的轉(zhuǎn)換 雖然 Java 的類型轉(zhuǎn)換采用 C 語(yǔ)言類型轉(zhuǎn)換的描述形式,但功能不同 ? 在牽涉到基本類型時(shí),可能需要做值的轉(zhuǎn)換 ? 在牽涉到類類型時(shí),需要做動(dòng)態(tài)的類型轉(zhuǎn)換合法性檢查 – 如果發(fā)現(xiàn)錯(cuò)誤,就拋出異常 ClassCastException – 否則做 “非變換類型轉(zhuǎn)換 ”,把相應(yīng)引用直接當(dāng)作所需的類型的引用 ? 從基本類型值到類類型的合法轉(zhuǎn)換,還需要自動(dòng)構(gòu)造對(duì)象( boxing);從類對(duì)象到基本類型值的轉(zhuǎn)換需要提取對(duì)象內(nèi)的值( unboxing) 運(yùn)行時(shí)類型描述機(jī)制還被用于支持 “自反 ”( reflection)功能 Ada 的面向?qū)ο髾C(jī)制 ?定義類和實(shí)例對(duì)象 Ada95以抽象數(shù)據(jù)類型實(shí)現(xiàn)類。上述轉(zhuǎn)換的正確寫法: bar *x = dynamic_castbar*(q)。 恰好 bar 對(duì)象的起始位置和各成分的偏移量與 foo 一樣 這些條件有時(shí)不成立(下面會(huì)看到,在存在多重繼承時(shí)) 這種轉(zhuǎn)換不安全,它要求 q 指向的確實(shí)是 bar。 s = q 也是靜態(tài)類型錯(cuò)(不能保證 q 指向的是 bar,賦值不安全) 能不能用 s = (bar*)q ? ? 如果 q 指向的確實(shí)是一個(gè) bar 對(duì)象,當(dāng)前情況下恰好可以,因?yàn)? – 因?yàn)榕缮惏愃袛?shù)據(jù)成分,因此可以支持基類所有操作 ? 后一個(gè)賦值是編譯時(shí)錯(cuò)誤,派生類指針不能引用基類對(duì)象 類層次結(jié)構(gòu)和強(qiáng)制轉(zhuǎn)換 ? 如果用 foo 類的指針 q 傳遞一個(gè)對(duì)象 ? 可保證該對(duì)象一定是 foo 的或它的某個(gè)派生類的對(duì)象 ? 如果由 foo 類指針 q 傳遞的實(shí)際上是一個(gè) bar 對(duì)象,我們有時(shí)需要把它作為 bar 對(duì)象使用,例如想對(duì)它調(diào)用 foo 里沒有的方法 – 每次方法調(diào)用需要多執(zhí)行兩條指令(典型情況),多訪問內(nèi)存兩次 ? 對(duì)這種受限對(duì)象模型,動(dòng)態(tài)約束方法調(diào)用的額外開銷不大,一般軟件系統(tǒng)(包括系統(tǒng)軟件的絕大部分情況)都可以接受 Stroustrup 在設(shè)計(jì)和實(shí)現(xiàn) C++ 語(yǔ)言時(shí)特別希望能夠得到高效的實(shí)現(xiàn),最后選擇了這種對(duì)象模型,并設(shè)計(jì)了這種高效的實(shí)現(xiàn)方法 動(dòng)態(tài)約束的實(shí)現(xiàn) ? 對(duì)數(shù)據(jù)抽象和面向?qū)ο蠹夹g(shù)的支持,以及高效的實(shí)現(xiàn),使實(shí)際軟件工作者看到了 C++(和 OO)的潛力,最終導(dǎo)致了面向?qū)ο蟮母锩? ? 以后的主流面向?qū)ο笳Z(yǔ)言也都采用了這種技術(shù)。 構(gòu)造方法表的工作在編譯時(shí)完成 – 類層次結(jié)構(gòu)是靜態(tài)確定的 – 如 D 覆蓋了 B 的某個(gè)(某些)動(dòng)態(tài)約束方法,就用新方法的指針覆蓋虛表里對(duì)應(yīng)的已有指針。 類層次結(jié)構(gòu)是靜態(tài)確定的 – 在提供了極大靈活性的同時(shí),也帶來效率上的巨大開銷 – 這種方法的缺點(diǎn)是效率太低。如果找到就調(diào)用,找不到就發(fā)出一個(gè) “message is not understood”( Smalltalk)動(dòng)態(tài)錯(cuò)誤 ? 這種方式普遍有效,可以處理具有任何動(dòng)態(tài)性質(zhì)的對(duì)象模型,如動(dòng)態(tài)類層次結(jié)構(gòu)構(gòu)造和動(dòng)態(tài)方法更新(修改、添加和刪除)、動(dòng)態(tài)類屬關(guān)系等 – 每個(gè)對(duì)象里必須保存所屬類的信息(一個(gè)類指針,指向其類) – 靜態(tài)約束的方法還可以做 inline 處理 方法的動(dòng)態(tài)約束 ?B 類里定義了一個(gè)一般性操作 tem,對(duì)所有 B類對(duì)象都有價(jià)值 ?tem 中調(diào)用了一個(gè)特殊操作 sp,該操作可能因子類不同而不同 ?子類 D 覆蓋操作 sp后,仍能正常地調(diào)用操作 tem,而且其中對(duì) sp 的調(diào)用能調(diào)用到 D 類里新的操作定義 這是 OO 程序設(shè)計(jì)里最重要的東西: 這一特征使新類給出的行為擴(kuò)充(或修改)可以自然地融合到已有功能里,包括放入已有的操作 框架里(這個(gè)例子就是) 動(dòng)態(tài)約束的實(shí)現(xiàn):一般模型 ? 對(duì)最一般的對(duì)象模型,運(yùn)行中調(diào)用動(dòng)態(tài)約束的方法時(shí)要做一次與編譯時(shí)處理靜態(tài)約束方法一樣的查找,這種查找可能非常耗時(shí) ? 為完成這種方法查找: – 運(yùn)行時(shí)的動(dòng)作與一般子程序調(diào)用完全一樣,沒有任何額外運(yùn)行開銷 – 如果在這里找到了所需要的方法,就生成對(duì)它的調(diào)用;如果不存在就反復(fù)做下一步 – 2. 轉(zhuǎn)到當(dāng)前類的基類里去查找相應(yīng)方法,如果找到就生成對(duì)它的調(diào)用;如果找不到就繼續(xù)沿著基類鏈上溯查找 – 3. 如果已無上層基類,查找失敗。少數(shù)語(yǔ)言同時(shí)也支持靜態(tài)約束的方法,如 C++、 Ada 等 ? C++ 把動(dòng)態(tài)約束的方法稱為虛方法( virtual 方法),而且以靜態(tài)約束作為默認(rèn)方式。 m 是 x 的定義類型(類,假定為 B)的一個(gè)方法 ? 問題: (...) 所調(diào)用的方法何時(shí) /根據(jù)什么確定??jī)煞N可能性: ? 根據(jù)變量 x 的類型(在程序里靜態(tài)定義)確定(靜態(tài)約束) ? 根據(jù)方法調(diào)用時(shí)(被 x 引用 /指向)的當(dāng)前對(duì)象的類型確定(動(dòng)態(tài)約束) – 對(duì)象關(guān)聯(lián)和 GC 順序的不確定性使終結(jié)動(dòng)作很難描述 靜態(tài)和動(dòng)態(tài)約束的方法 ? OO 語(yǔ)言里的方法調(diào)用通常采用 (...) 的形式,其中 – 有了 GC,對(duì)終結(jié)動(dòng)作的需求大大減少,終結(jié)動(dòng)作由 GC 自動(dòng)進(jìn)行 – 類變量是堆棧上的對(duì)象,在其作用域退出時(shí),自動(dòng)調(diào)用它們的終結(jié)動(dòng)作 – 這種構(gòu)造規(guī)則是遞歸的,語(yǔ)言必須嚴(yán)格定義對(duì)象的構(gòu)造順序 ? 如果變量采用值語(yǔ)義(例如 C++),在進(jìn)入一個(gè)作用域的過程中,就可能出現(xiàn)許多構(gòu)造函數(shù)調(diào)用 – 對(duì)象內(nèi)部的基類部分必須在派生類部分之前完成初始化,因?yàn)榕缮愋略龅臄?shù)據(jù)成員完全可能依賴于基類成員的值 – 對(duì)象創(chuàng)建可能有多種需要,為此 C++/Java 等都支持一個(gè)類有多個(gè)不同的構(gòu)造函數(shù) 初始化和終結(jié)處理 ? 如果變量采用引用語(yǔ)義,所有(值)對(duì)象都需要顯式創(chuàng)建,有明確的創(chuàng)建動(dòng)作。 D類對(duì)象的前部仍 是 B類的所有成員,擴(kuò)充的成員排在后面 ? 在 D類對(duì)象里,所有 B類成員相對(duì)于對(duì)象開始位置的偏 移量與它們?cè)谝粋€(gè) B類對(duì)象里的偏移量相同 ? 這樣, D 類對(duì)象就可以作為 B 類對(duì)象使用, B 類里的 方法能正確操作,它們只看屬于 B 對(duì)象的那部分 ? D 類里的方法既可以使用對(duì)象中的 B 類數(shù)據(jù)成員,也 可以使用對(duì)象里的 D 類數(shù)據(jù)成員 用 D類對(duì)象給 B類對(duì)象 “賦值 ”(值 copy,或者值語(yǔ)義時(shí)) 會(huì)產(chǎn)生 “切割 ”現(xiàn)象, D 類數(shù)據(jù)成員不能拷貝 B類的 數(shù)據(jù)成員 B類的 數(shù)據(jù)成員 D類新增的 數(shù)據(jù)成員 B類的對(duì)象 D類的對(duì)象 初始化和終結(jié)處理 對(duì)象可能具有任意復(fù)雜的內(nèi)部結(jié)構(gòu) ? 要求創(chuàng)建對(duì)象的程序段做對(duì)象初始化,需反復(fù)描述,很麻煩,易弄錯(cuò) ? 對(duì)象可能要求特殊的初始化方式和順序,對(duì)象的使用者難以貫徹始終 ? 繼承使對(duì)象的初始化更復(fù)雜化,因?yàn)樾枰_初始化繼承來的數(shù)據(jù)成員 ? 為更容易處理對(duì)象初始化的問題, OO 語(yǔ)言通常都提供了專門的機(jī)制,在對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用 ? 初始化操作保證新創(chuàng)建對(duì)象具有合法的狀態(tài)。 不能生成有用的實(shí)例(生成的是空實(shí)例,沒有局部的實(shí)例狀態(tài)) – 通常采用某種基于定義類的語(yǔ)法形式調(diào)用 僅有靜態(tài)數(shù)據(jù)成員和靜態(tài)方法的類,相當(dāng)于一個(gè)簡(jiǎn)單模塊 – 沒有調(diào)用對(duì)象 – 類對(duì)象可以通過靜態(tài)數(shù)據(jù)成員交換或者共享信息 靜態(tài)域和靜態(tài)方法 – 靜態(tài)成員是靜態(tài)創(chuàng)建的,其初始化在程序開始執(zhí)行前完成(或者在語(yǔ)言定義的適當(dāng)時(shí)刻完成),只做一次 – 靜態(tài)成員的初始化中不能調(diào)用類的普通方法(因?yàn)闆]有對(duì)象) 靜態(tài)方法相當(dāng)于普通子程序,只是具有類封裝(類作用域)。 類的靜態(tài)方法可訪問靜態(tài)數(shù)據(jù)成員,其他方法也可以訪問靜態(tài)數(shù)據(jù)成員 – 類外能否訪問由語(yǔ)言確定(提出有與其他成員一樣的訪問控制) 靜態(tài)方法和靜態(tài)域的一些情況: – Smalltalk 把普通的對(duì)象域稱為實(shí)例變量,表示在這個(gè)類的每個(gè)實(shí)例里都有這些成分的一份拷貝;把靜態(tài)數(shù)據(jù)域稱為 類變量 – private繼承,使基類的所有成員變成派生類的 private 成員 一些新語(yǔ)言借鑒了 C++ 的這方面思想,可能結(jié)合另外一些想法 靜態(tài)域和靜態(tài)方法 許多面向?qū)ο笳Z(yǔ)言的類里可以定義靜態(tài)域和靜態(tài)方法 – public 繼承 – 作為 “開模塊 ”(允許以特定方式任意訪問類成員) – 繼承的實(shí)現(xiàn),使派生類型的對(duì)象能當(dāng)作基類的對(duì)象使用 – 通過繼承實(shí)現(xiàn)存儲(chǔ)具體類型的元素的具體容器 每個(gè)結(jié)點(diǎn)里有一個(gè)域指向表頭結(jié)點(diǎn) OO 程序 派生的 int 表結(jié)點(diǎn)類 使用這種 int 表的問題: 如果需要訪問結(jié)點(diǎn)的數(shù)據(jù)內(nèi)容,必須對(duì)取出的結(jié)點(diǎn)做強(qiáng)制 通用的表結(jié)點(diǎn)類 面向?qū)ο筇卣鞯膶?shí)現(xiàn) ? 實(shí)現(xiàn)面向?qū)ο蟮恼Z(yǔ)言,需要考慮它的幾個(gè)標(biāo)志性特征的實(shí)現(xiàn) ? 封裝是一種靜態(tài)機(jī)制,如 C++/Java 一類語(yǔ)言的各種訪問控制機(jī)制也是靜態(tài)的,都可以通過在符號(hào)表里記錄信息,在編譯中檢查和處理 ? 方法的實(shí)現(xiàn)與以模塊為類型時(shí)局部子程序的實(shí)現(xiàn)一樣。(只是作為示例) OO 程序 ? 還可以定義通用的容器類: – OO 語(yǔ)言有關(guān)的理論研究還處在起步階段,也是本領(lǐng)域不成熟的標(biāo)志 OO 語(yǔ)言需要提供的新機(jī)制 ? 定義類的語(yǔ)言機(jī)制(語(yǔ)言提供特殊的描述結(jié)構(gòu)) ? 描述或定義對(duì)象的機(jī)制 ? 繼承機(jī)制,描述類之間的繼承關(guān)系。 許多語(yǔ)言的 OO 機(jī)制非常復(fù)雜,實(shí)際還不斷提出一些新要求,使一些 OO 語(yǔ)言在發(fā)展中變得越來越復(fù)雜 – 在基于類的模型中允許基于對(duì)象的行為覆蓋(可修改個(gè)別對(duì)象的行為) – 對(duì)象的行為繼承通過原型獲得 面向?qū)ο蟮恼Z(yǔ)言 ? 人們
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1