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

正文內(nèi)容

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

2024-10-11 08:15上一頁面

下一頁面
  

【正文】 一些相互有關(guān)的類型,可能需要把它們送給同一個(gè)函數(shù) /過程去處理,以同樣方式存儲(chǔ) – 變體和聯(lián)合機(jī)制就是為了迎合這方面的需要,但它們沒有類型安全性,且未能提供解決類似問題的統(tǒng)一框架,難用于應(yīng)付更復(fù)雜的情況 – 支持相關(guān)類型,可能給程序的結(jié)構(gòu)組織帶來新的可能性 ? 如何在抽象數(shù)據(jù)類型的框架中提供這一類功能,也是需要解決的問題 ? 面向?qū)ο蟮母拍钤谶@些方面都能發(fā)揮很大的作用 ? 面向?qū)ο螅?ObjectOriented)的方法和程序技術(shù),為基于模塊(一個(gè)類也可以看作一個(gè)模塊)的重用問題提供了一條解決途徑。 類的概念源自 Simula,其設(shè)計(jì)中提出用類定義把一組操作與一組數(shù)據(jù)包裝起來。 常規(guī)語言(如 C)引進(jìn)了指向函數(shù)的指針,在實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)程序設(shè)計(jì)的過程中起到了重要作用,也成為面向?qū)ο笳Z言實(shí)現(xiàn)的技術(shù)基礎(chǔ) OO 發(fā)展史 繼承和動(dòng)態(tài)約束等被 Smalltalk 發(fā)展,形成目前 OO 的基本概念框架 ? 程序里以類的方式定義各種數(shù)據(jù)抽象 ? 類可以通過繼承的方式擴(kuò)充新功能,這樣定義的新類(子類,派生類)自動(dòng)繼承已有類(基類,超類,父類)的功能 ? 對(duì)象是類的實(shí)例,是程序運(yùn)行時(shí)的基本數(shù)據(jù)單元 ? 派生類的對(duì)象也看作是原有基類的對(duì)象,可以當(dāng)作基類的對(duì)象使用(子類就是子類型,Liskov 代換原理, 2020 年圖靈獎(jiǎng)) ? 類定義了對(duì)象的狀態(tài)成分(數(shù)據(jù)成員)和一組相關(guān)操作(稱為方法) ? 方法調(diào)用總是針對(duì)某個(gè)對(duì)象進(jìn)行的,將方法調(diào)用看作是給相應(yīng)對(duì)象送一個(gè)消息,對(duì)象通過執(zhí)行相應(yīng)操作的方式對(duì)消息做出響應(yīng) ? 對(duì)一個(gè)消息執(zhí)行什么方法,由接收消息的對(duì)象的類型確定(根據(jù)該對(duì)象所屬的類確定,這就是動(dòng)態(tài)約束) ? 計(jì)算,就是一組對(duì)象相互通訊的整體效果(對(duì)計(jì)算的另一種看法) OO 發(fā)展史 Smalltalk 還有一些獨(dú)特的東西: ? 變量采用引用模型,變量無類型,可以引用任何對(duì)象 ? 語言里的一切都是對(duì)象: – 子類可以修改基類已經(jīng)定義的行為,或者增加所需的新行為 ? 把子類看作是子類型(通常),如果 D 是 B 的子類,那么: – C++ 設(shè)法在支持系統(tǒng)程序設(shè)計(jì)的過程性語言 C 上 “擴(kuò)充 ”支持面向?qū)ο蟮臋C(jī)制,是一種多范型語言,支持多種程序設(shè)計(jì)方式 – 大多數(shù) OO 語言都依賴于自動(dòng)存儲(chǔ)回收系統(tǒng) – Ruby 是一個(gè)純面向?qū)ο蟮哪_本語言,其中的一切都是對(duì)象,全局環(huán)境看作一個(gè)匿名的大對(duì)象,全局環(huán)境里的函數(shù)看作這個(gè)對(duì)象的成員函數(shù)。 許多語言的 OO 機(jī)制非常復(fù)雜,實(shí)際還不斷提出一些新要求,使一些 OO 語言在發(fā)展中變得越來越復(fù)雜 – 繼承的實(shí)現(xiàn),使派生類型的對(duì)象能當(dāng)作基類的對(duì)象使用 – Smalltalk 把普通的對(duì)象域稱為實(shí)例變量,表示在這個(gè)類的每個(gè)實(shí)例里都有這些成分的一份拷貝;把靜態(tài)數(shù)據(jù)域稱為 類變量 – 沒有調(diào)用對(duì)象 – 對(duì)象創(chuàng)建可能有多種需要,為此 C++/Java 等都支持一個(gè)類有多個(gè)不同的構(gòu)造函數(shù) 初始化和終結(jié)處理 ? 如果變量采用引用語義,所有(值)對(duì)象都需要顯式創(chuàng)建,有明確的創(chuàng)建動(dòng)作。 有了 GC,對(duì)終結(jié)動(dòng)作的需求大大減少,終結(jié)動(dòng)作由 GC 自動(dòng)進(jìn)行 – 如果在這里找到了所需要的方法,就生成對(duì)它的調(diào)用;如果不存在就反復(fù)做下一步 – 2. 轉(zhuǎn)到當(dāng)前類的基類里去查找相應(yīng)方法,如果找到就生成對(duì)它的調(diào)用;如果找不到就繼續(xù)沿著基類鏈上溯查找 – 3. 如果已無上層基類,查找失敗。如果找到就調(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)系等 – 如 D 覆蓋了 B 的某個(gè)(某些)動(dòng)態(tài)約束方法,就用新方法的指針覆蓋虛表里對(duì)應(yīng)的已有指針。因?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 里沒有的方法 – 一些 C++ 編譯器要求用戶指明需要用 RTTI,在這種情況下才按這種方式創(chuàng)建虛表(虛表的形式與沒有類描述符時(shí)不同) ? dynamic_cast 檢查類型關(guān)系,確定能否轉(zhuǎn)換,在能轉(zhuǎn)換就完成轉(zhuǎn)換 類層次結(jié)構(gòu)和強(qiáng)制轉(zhuǎn)換 多數(shù) OO 語言(如 Java 等)默認(rèn)支持 RTTI,虛表里總保存類描述符 ? 如何描述類型是編譯器的具體實(shí)現(xiàn)問題,不必關(guān)心 ? RTTI 機(jī)制可保證類型安全的轉(zhuǎn)換 雖然 Java 的類型轉(zhuǎn)換采用 C 語言類型轉(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)類。ClassCAB39。 也無泄露 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。 可以 , T‘Class束定為 V的類型 類寬類型的范圍示意如下: TAA AB ACCABCBCACBA類(型)T的繼承樹CA39。上述轉(zhuǎn)換的正確寫法: bar *x = dynamic_castbar*(q)。 每次方法調(diào)用需要多執(zhí)行兩條指令(典型情況),多訪問內(nèi)存兩次 ? 對(duì)這種受限對(duì)象模型,動(dòng)態(tài)約束方法調(diào)用的額外開銷不大,一般軟件系統(tǒng)(包括系統(tǒng)軟件的絕大部分情況)都可以接受 Stroustrup 在設(shè)計(jì)和實(shí)現(xiàn) C++ 語言時(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言也都采用了這種技術(shù)。 類層次結(jié)構(gòu)是靜態(tài)確定的 – 每個(gè)對(duì)象里必須保存所屬類的信息(一個(gè)類指針,指向其類) – 少數(shù)語言同時(shí)也支持靜態(tài)約束的方法,如 C++、 Ada 等 ? C++ 把動(dòng)態(tài)約束的方法稱為虛方法( virtual 方法),而且以靜態(tài)約束作為默認(rèn)方式。 類變量是堆棧上的對(duì)象,在其作用域退出時(shí),自動(dòng)調(diào)用它們的終結(jié)動(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,或者值語義時(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 語言通常都提供了專門的機(jī)制,在對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用 ? 初始化操作保證新創(chuàng)建對(duì)象具有合法的狀態(tài)。 類對(duì)象可以通過靜態(tài)數(shù)據(jù)成員交換或者共享信息 靜態(tài)域和靜態(tài)方法 – 靜態(tài)成員是靜態(tài)創(chuàng)建的,其初始化在程序開始執(zhí)行前完成(或者在語言定義的適當(dāng)時(shí)刻完成),只做一次 – 靜態(tài)成員的初始化中不能調(diào)用類的普通方法(因?yàn)闆]有對(duì)象) 靜態(tài)方法相當(dāng)于普通子程序,只是具有類封裝(類作用域)。 private繼承,使基類的所有成員變成派生類的 private 成員 一些新語言借鑒了 C++ 的這方面思想,可能結(jié)合另外一些想法 靜態(tài)域和靜態(tài)方法 許多面向?qū)ο笳Z言的類里可以定義靜態(tài)域和靜態(tài)方法 – 通過繼承實(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言,需要考慮它的幾個(gè)標(biāo)志性特征的實(shí)現(xiàn) ? 封裝是一種靜態(tài)機(jī)制,如 C++/Java 一類語言的各種訪問控制機(jī)制也是靜態(tài)的,都可以通過在符號(hào)表里記錄信息,在編譯中檢查和處理 ? 方法的實(shí)現(xiàn)與以模塊為類型時(shí)局部子程序的實(shí)現(xiàn)一樣。 在基于類的模型中允許基于對(duì)象的行為覆蓋(可修改個(gè)別對(duì)象的行為) – C++ 和 Ada 提供靜態(tài)約束(默認(rèn))和動(dòng)態(tài)約束兩種方式 ? 一些腳本語言也支持面向?qū)ο蟮母拍睢?為在這種環(huán)境下編程,人們開發(fā)了許多利用自動(dòng)對(duì)象的對(duì)象管理技術(shù),如句柄對(duì)象,對(duì)象的 “創(chuàng)建即初始化 ”技術(shù)等 ? 是否依賴自動(dòng)廢料收集( GC)。 Smalltalk 盡可能追求 “面向?qū)ο?”理想,完全是重新設(shè)計(jì)的新語言 – OO 概念與常規(guī)語言的合理集成(在當(dāng)時(shí)),支持?jǐn)?shù)據(jù)抽象和面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)和程序設(shè)計(jì),支持多泛型程序設(shè)計(jì)的結(jié)合,使與數(shù)據(jù)抽象和 OO 有關(guān)的許多新概念和新技術(shù)逐漸被實(shí)際軟件工作者接受 ? 隨后是 OO 分析、 OO 設(shè)計(jì)和基于 OO 的軟件開發(fā)等等 ? 后來的其他成功語言包括 Java,微軟提出 C,等等 ? 出現(xiàn)了一些基于對(duì)象的腳本語言,如 Python, Ruby 等 ? 現(xiàn)在,面向?qū)ο蟮拈_發(fā)已經(jīng)成為一種主流的軟件開發(fā)技術(shù) 面向?qū)ο蟮幕靖拍? 面向?qū)ο蟮幕靖拍睿? ? 在面向?qū)ο笳Z言里定義數(shù)據(jù)抽象的基本定義機(jī)制是類,在一個(gè)類里可以定義數(shù)據(jù)成員和子程序成員(稱為方法) ? 封裝是數(shù)據(jù)抽象和模塊化的概念,與面向?qū)ο蟮母拍畈]有必然關(guān)系,但封裝有助于更好發(fā)揮面向?qū)ο髾C(jī)制的作用 ? (實(shí)在的)類被看作類型,可以用于生成(定義)實(shí)例,稱為對(duì)象 ? 已有的類可以作為定義新類的基礎(chǔ)(基類、超類) – 將計(jì)算功能(子程序)約束于程序里處理的數(shù)據(jù)(結(jié)構(gòu)),使我們?cè)诔绦蚶锟梢詮臄?shù)據(jù)對(duì)象出發(fā)去啟動(dòng)相應(yīng)的計(jì)算過程 – 1960 年代在挪威計(jì)算中心設(shè)計(jì)和實(shí)現(xiàn),主持其工作的 OleJohan Dahl 和 Kristen Nygaard 獲得 2020 年圖靈獎(jiǎng) – 如果模塊功能的改變只能通過修改源代碼的方式進(jìn)行,程序員就只能拷
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1