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

正文內(nèi)容

第四章面向?qū)ο蟪绦蛟O(shè)計語言(文件)

2025-09-22 08:15 上一頁面

下一頁面
 

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