類型系統(tǒng)程序設計語言原理課件_第1頁
類型系統(tǒng)程序設計語言原理課件_第2頁
類型系統(tǒng)程序設計語言原理課件_第3頁
類型系統(tǒng)程序設計語言原理課件_第4頁
類型系統(tǒng)程序設計語言原理課件_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、類型系統(tǒng)程序設計語言原理課件類型系統(tǒng)程序設計語言原理課件1. C+語言的面向對象特征對象模型:封裝(1) 訪問控制機制:C+提供完善的訪問控制機制,分別是: public,protected和private。private, public, protected 訪問標號的訪問范圍public可訪問1.該類中的函數(shù) ; 2.子類的函數(shù);3.其友元函數(shù)訪問;4.該類的對象訪問;protected可訪問1.該類中的函數(shù);2.子類的函數(shù);3.其友元函數(shù)訪問;不可訪問1.該類的對象訪問;private可訪問1.該類中的函數(shù);2.其友元函數(shù)訪問;不可訪問1.子類的函數(shù);2.該類的對象訪問;表1 priva

2、te, public, protected 訪問標號的訪問范圍1. C+語言的面向對象特征對象模型:封裝private,1. C+語言的面向對象特征1. C+語言的面向對象特征1. C+語言的面向對象特征對象模型:封裝(2) 對象的獨立性:C+中對象本身不具有獨立性,也就是對象必須屬于某一個類;(3) 類本身是不是對象?C+中類本身不是對象,對象是類的實例化;(4) 基于類的模型,還是基于對象或原型的模型?C+是基于類的模型;1. C+語言的面向對象特征對象模型:封裝1. C+語言的面向對象特征對象模型:繼承(1) 類層次結構:采用單根的類層次結構,還是任意的類層次結構?C+采用任意的類層次結

3、構;(2) 繼承方式:提供哪些繼承方式?C+采用三種繼承方式,分別是public繼承,protected繼承,private繼承;publicprotectedprivatepublic繼承publicprotected不可用protected繼承protectedprotected不可用private繼承privateprivate不可用表2 類的繼承方式1. C+語言的面向對象特征對象模型:繼承publicpr1. C+語言的面向對象特征對象模型:繼承(3) 采用基于繼承的模型,還是基于指派的模型?C+是基于繼承的模型(4) 允許多重繼承?還是只允許單繼承?C+允許單繼承、多繼承、多重繼承

4、和虛繼承;在單繼承中,每個類可以有多個派生類,但是每個派生類只能有一個基類,從而形成樹形結構;圖1 單繼承實例1. C+語言的面向對象特征對象模型:繼承在單繼承中,每個1. C+語言的面向對象特征對象模型:繼承(4) 允許多重繼承?還是只允許單繼承?C+允許單繼承、多繼承、多重繼承和虛繼承;圖3 多重繼承實例圖2 多繼承實例1. C+語言的面向對象特征對象模型:繼承圖3 多重繼承實1. C+語言的面向對象特征對象模型:繼承(4) 允許多重繼承?還是只允許單繼承?C+允許單繼承、多繼承、多重繼承和虛繼承;C+使用虛擬繼承,解決從不同途徑繼承來的同名的數(shù)據(jù)成員在內存中有不同的拷貝造成數(shù)據(jù)不一致問題

5、,將共同基類設置為虛基類。圖4 虛繼承實例1. C+語言的面向對象特征對象模型:繼承C+使用虛擬繼1. C+語言的面向對象特征對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。多態(tài)類屬重載虛函數(shù)同名函數(shù)模板函數(shù)1. C+語言的面向對象特征對象模型:多態(tài)多態(tài)類屬重載虛函1. C+語言的面向對象特征對象模型:多態(tài)(1) 類屬:虛函數(shù)用父類的指針指向其子類的實例,然后通過父類的指針調用實際子類的成員函數(shù),這種技術可以讓父類的指針有“多種形態(tài)”;1. C+語言的面向對象特征對象模型:多態(tài)用父類的指針指向1. C+語言的面向對象特征對象模型:多態(tài)(2) 類屬:模板函數(shù)模板是C+支持

6、參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)聲明一種一般模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類型。1. C+語言的面向對象特征對象模型:多態(tài)模板是C+支持1. C+語言的面向對象特征對象模型:多態(tài)(3) 重載:同名函數(shù)有兩個或多個函數(shù)名相同的函數(shù),但是函數(shù)的形參列表不同。在調用相同函數(shù)名的函數(shù)時,根據(jù)形參列表確定到底該調用哪一個函數(shù)。1. C+語言的面向對象特征對象模型:多態(tài)有兩個或多個函數(shù)1. C+語言的面向對象特征其他問題(1) 是不是追求“純粹”的面向對象語言?C+語言不是“純粹”的面向對象語言;1) main函數(shù)不在任何類里面;2) 基本的數(shù)據(jù)類型不是對象

7、;3) 友元會破壞封裝性;4) 支持獨立的函數(shù),數(shù)據(jù),即過程化編程;1. C+語言的面向對象特征其他問題1. C+語言的面向對象特征其他問題(2) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的存儲區(qū)里;而在變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;C+采用的是值模型,可以創(chuàng)建靜態(tài)對象或棧對象;但只有通過對象引用或指向對象的指針才能實現(xiàn)面向對象的動態(tài)約束行為。1. C+語言的面向對象特征其他問題1. C+語言的面向對象特征其他問題(3) 是否允許靜態(tài)對象或者堆棧對象(自動對象)?C+支持靜態(tài)對象和自動對象;靜態(tài)對象:變量定

8、義在函數(shù)外或是用static關鍵字修飾的變量存放在靜態(tài)存儲區(qū)。放在靜態(tài)存儲區(qū)的數(shù)據(jù)在整個程序運行期間持續(xù)有效。自動對象:C+默認局部變量的生命期局限于所在函數(shù)的每次執(zhí)行期間。只有當定義它的函數(shù)被調用時才存在的對象成為自動對象。自動對象在每次調用函數(shù)時創(chuàng)建和撤銷。1. C+語言的面向對象特征其他問題1. C+語言的面向對象特征其他問題(4) 是否依賴自動廢料收集(GC)?C+ 不依賴自動廢料收集(GC);大多數(shù)OO語言都依賴于自動存儲回收系統(tǒng);C+是例外,其設計目標之一是盡可能避免對自動存儲回收的依賴,以支持系統(tǒng)程序設計,提高效率,減少運行時間上的不確定性。1. C+語言的面向對象特征其他問題1

9、. C+語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采用“x. m(.)”的形式。其中,x 是一個指向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就稱之為動態(tài)約束。C+提供靜態(tài)約束(默認)和動態(tài)約束兩種方式;1. C+語言的面向對象特征其他問題1. C+語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?C+提供靜態(tài)約束(默認)和動態(tài)約束兩種方式;靜態(tài)約束動態(tài)約束1. C+語言的面向對象特征其他問題靜態(tài)約束動態(tài)約束1. C+語言

10、的面向對象特征其他問題(6) 類類型對象的動態(tài)轉換機制C+提供的類類型對象的轉換形式如下:dynamic_cast(expression): dynamic_cast 主要用來執(zhí)行“安全向下轉型”(Safe downcasting),也就是用來決定某對象是否歸屬繼承體系中的某個類型;在使用時需要注意:被轉換對象obj的類型T1必須是多態(tài)類型,即T1必須公有繼承自其它類,或者T1擁有虛函數(shù)(繼承或自定義)。若T1為非多態(tài)類型,使用dynamic_cast會報編譯錯誤。基本用法:dynamic_cast可以獲取目標對象的引用或指針:T1 obj;T2* pObj = dynamic_cast(&o

11、bj);/轉換為T2指針,失敗返回NULL;1. C+語言的面向對象特征其他問題在使用時需要注意:被轉1. C+語言的面向對象特征其他問題(6) 類類型對象的動態(tài)轉換機制在多態(tài)類型間轉換,分為3種類型:1) 子類向基類的向上轉型(Up Cast)2) 基類向子類的向下轉型(Down Cast)3) 橫向轉型(Cross Cast)1. C+語言的面向對象特征其他問題1. C+語言的面向對象特征其他問題(6) 類類型對象的動態(tài)轉換機制/橫向轉型成功Shape *pShape2 = new Circle();Rollable *pRollable2 = dynamic_cast(pShape2);

12、1. C+語言的面向對象特征其他問題/橫向轉型成功2. Java語言的面向對象特征對象模型:封裝(1) 訪問控制機制:Java提供完善的訪問控制機制,分別是: public,protected、friendly和private。Java類中成員修飾符的訪問權限publicprotectedfriendlyprivate本類本包子類其他表3 Java類中成員修飾符的訪問權限2. Java語言的面向對象特征對象模型:封裝Java類中成2. Java語言的面向對象特征對象模型:封裝(2) 對象的獨立性:Java中對象本身不具有獨立性,也就是對象必須屬于某一個類;(3) 類本身是不是對象?Java中類

13、本身不是對象,對象是類的實例化;(4) 基于類的模型,還是基于對象或原型的模型?Java是基于類的模型;2. Java語言的面向對象特征對象模型:封裝2. Java語言的面向對象特征對象模型:繼承(1) 類層次結構:采用單根的類層次結構,還是任意的類層次結構?Java采用單根的類層次結構;單根層次結構:所有類是否都應從單獨一個基礎類繼承?在Java中,對這個問題的答案都是肯定的,而且這個終級基礎類的名字很簡單,就是“Object”。2. Java語言的面向對象特征對象模型:繼承2. Java語言的面向對象特征對象模型:繼承(2) 繼承方式:提供哪些繼承方式?Java只有普通的extends繼承

14、方式;當創(chuàng)建一個類時,總是在繼承,如果沒有明確指出要繼承的類,就總是隱式地從根類Object進行繼承。2. Java語言的面向對象特征對象模型:繼承當創(chuàng)建一個類時2. Java語言的面向對象特征對象模型:繼承(3) 采用基于繼承的模型,還是基于指派的模型?Java是基于繼承的模型(4) 允許多重繼承?還是只允許單繼承?Java中類允許單繼承和多重繼承;在單繼承中,每個類可以有多個派生類,但是每個派生類只能有一個基類,從而形成樹形結構;圖5 單繼承實例2. Java語言的面向對象特征對象模型:繼承在單繼承中,每2. Java語言的面向對象特征多重繼承實例2. Java語言的面向對象特征多重繼承實

15、例2. Java語言的面向對象特征對象模型:繼承(4) 允許多重繼承?還是只允許單繼承?Java中接口允許多繼承;2. Java語言的面向對象特征對象模型:繼承2. Java語言的面向對象特征對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。多態(tài)類屬重載同名函數(shù)方法覆蓋2. Java語言的面向對象特征對象模型:多態(tài)多態(tài)類屬重載同2. Java語言的面向對象特征對象模型:多態(tài)(1) 類屬:方法覆蓋覆蓋實現(xiàn)多態(tài)性:通過子類對父類的重定義來實 現(xiàn)。方法的參數(shù)個數(shù),類型,順序要完全相同。2. Java語言的面向對象特征對象模型:多態(tài)覆蓋實現(xiàn)多態(tài)性2. Java語言的面向對象特征對

16、象模型:多態(tài)(2) 重載:同名函數(shù)重載實現(xiàn)多態(tài)性:通過在一個類中定義多個同名的方法來實現(xiàn)。方法的參數(shù)個數(shù),類型,順序要有所不同。2. Java語言的面向對象特征對象模型:多態(tài)重載實現(xiàn)多態(tài)性2. Java語言的面向對象特征其他問題(1) 是不是追求“純粹”的面向對象語言?Java是接近理想的語言,但希望在形式上盡可能靠近常規(guī)語言1) 不存在全局變量和全局函數(shù);2) main函數(shù)是類的方法;3) 但,Java中基本數(shù)據(jù)類型以及類都不是對象。2. Java語言的面向對象特征其他問題2. Java語言的面向對象特征其他問題(2) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的

17、存儲區(qū)里;而在變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;Java除了基本類型外,變量采用引用模型,因此,Java沒有必要再另外提供引用變量或指針變量機制;2. Java語言的面向對象特征其他問題2. Java語言的面向對象特征其他問題(3) 是否允許靜態(tài)對象或者堆棧對象(自動對象)?Java支持靜態(tài)對象和自動對象;(4) 是否依賴自動廢料收集(GC)?Java提供自動廢料收集機制(GC);Java靜態(tài)對象和非靜態(tài)對象靜態(tài)對象非靜態(tài)對象擁有屬性是類共同擁有的是類各對象獨立擁有的內存分配內存空間上是固定的空間在各個附屬類里面分配分配順序先分配靜態(tài)對象的

18、空間初始化順序是先靜態(tài)再非靜態(tài)2. Java語言的面向對象特征其他問題Java靜態(tài)對象和非2. Java語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采用“x. m(.)”的形式。其中,x 是一個指向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就稱之為動態(tài)約束。Java中除了靜態(tài)的方法以外,其他所有的方法都采用動態(tài)約束;2. Java語言的面向對象特征其他問題2. Java語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?Jav

19、a中除了靜態(tài)的方法以外,所有的方法都采用動態(tài)約束;2. Java語言的面向對象特征其他問題2. Java語言的面向對象特征其他問題(6) 類類型對象的動態(tài)轉換機制Java語言的類類型對象的動態(tài)轉換機制如下:向上轉型:子類對象父類對象對于向上轉型,程序會自動完成;格式如下:父類 父類對象=子類實例;向下轉型:父類對象子類對象對于向下轉型,必須明確的指明要轉型的子類類型;格式如下:子類 子類對象=(子類)父類實例;2. Java語言的面向對象特征其他問題2. Java語言的面向對象特征向上轉型:子類對象父類對象向下轉型:父類對象子類對象2. Java語言的面向對象特征向上轉型:子類對象父類對象3.

20、 Python語言的面向對象特征對象模型:封裝(1) 訪問控制機制:Python提供的訪問控制機制,分別是: public和private;Python中,如果函數(shù)、類方法和屬性如果以兩個下劃線開頭,但是不以兩個下劃線結束,它就是private的,其他的一切都是public的。3. Python語言的面向對象特征對象模型:封裝Pytho3. Python語言的面向對象特征對象模型:封裝(2) 對象的獨立性:Python中對象本身不具有獨立性,也就是對象一定屬于某一個類;3. Python語言的面向對象特征對象模型:封裝3. Python語言的面向對象特征對象模型:封裝(3) 類本身是不是對象?

21、Python中類本身是對象;(4) 基于類的模型,還是基于對象或原型的模型?Python是基于對象的模型;3. Python語言的面向對象特征對象模型:封裝3. Python語言的面向對象特征對象模型:繼承(1) 類層次結構:采用單根的類層次結構,還是任意的類層次結構?Python 2.2版本以后,采用單根的類層次結構;單根層次結構:所有類是否都應從單獨一個基礎類繼承?在Python中,所有類都是Object類的子類。3. Python語言的面向對象特征對象模型:繼承3. Python語言的面向對象特征Python中類與對象的關系3. Python語言的面向對象特征Python中類與對象的3.

22、 Python語言的面向對象特征對象模型:繼承(2) 繼承方式:提供哪些繼承方式?Python采用兩種繼承方式,分別是:普通繼承方式;super繼承方式;3. Python語言的面向對象特征對象模型:繼承3. Python語言的面向對象特征普通繼承方式3. Python語言的面向對象特征普通繼承方式3. Python語言的面向對象特征super繼承方式3. Python語言的面向對象特征super繼承方式3. Python語言的面向對象特征對象模型:繼承(2) 繼承方式:提供哪些繼承方式?Python采用兩種繼承方式,分別是:普通繼承方式,super繼承方式;在super機制里可以保證公共父類

23、僅被執(zhí)行一次。3. Python語言的面向對象特征對象模型:繼承3. Python語言的面向對象特征對象模型:繼承(3) 采用基于繼承的模型,還是基于指派的模型?Python是基于繼承的模型(4) 允許多重繼承?還是只允許單繼承?Python允許單繼承、多繼承和多重繼承;在單繼承中,每個類可以有多個派生類,但是每個派生類只能有一個基類,從而形成樹形結構;圖6單繼承實例3. Python語言的面向對象特征對象模型:繼承在單繼承中3. Python語言的面向對象特征對象模型:繼承(4) 允許多重繼承?還是只允許單繼承?Python允許單繼承、多繼承和多重繼承;圖8 多重繼承實例圖7 多繼承實例3.

24、 Python語言的面向對象特征對象模型:繼承圖8 多重3. Python語言的面向對象特征對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。;多態(tài)類屬方法覆蓋參數(shù)傳遞3. Python語言的面向對象特征對象模型:多態(tài)多態(tài)類屬方3. Python語言的面向對象特征對象模型:多態(tài)參數(shù)傳遞通過動態(tài)束定機制3. Python語言的面向對象特征對象模型:多態(tài)通過動態(tài)束3. Python語言的面向對象特征對象模型:多態(tài)類屬通過Self指代對象本身3. Python語言的面向對象特征對象模型:多態(tài)通過Sel3. Python語言的面向對象特征其他問題(1) 是不是追求“純粹”的面向對

25、象語言?Python語言不是“純粹”的面向對象語言;1) 存在全局變量和全局函數(shù);2) main函數(shù)不是類的方法;3) 但Python一切皆對象。3. Python語言的面向對象特征其他問題3. Python語言的面向對象特征其他問題(2) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的存儲區(qū)里;而在變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;Python采用的是引用模型;變量通過引用建立與對象的聯(lián)系;3. Python語言的面向對象特征其他問題Python采3. Python語言的面向對象特征其他問題(3) 是否允許靜態(tài)對

26、象或者堆棧對象(自動對象)?Python支持靜態(tài)對象和自動對象;靜態(tài)對象所有語言的全局變量都是靜態(tài)對象;在Python語言中:使用global聲明全局變量; 用同樣的global語句可以指定多個全局變量,比如: global x, y, z。3. Python語言的面向對象特征其他問題3. Python語言的面向對象特征k=4def main():main()list1= def add(): add()for x in range(1,k): list1.append(x)print(list1)add Activation Recordmain Activation Recordlist1

27、module Activation Record kHeap1,2,3,44Run-time Stack堆棧對象(自動對象)3. Python語言的面向對象特征k=4def main3. Python語言的面向對象特征其他問題(4) 是否依賴自動廢料收集(GC)?Python依賴自動廢料收集(GC);Python默認采用引用計數(shù)來管理對象的內存回收。當引用計數(shù)為0時,將立即回收該對象內存,要么將對應的block標記為空閑,要么返還給操作系統(tǒng)。3. Python語言的面向對象特征其他問題3. Python語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采

28、用“x. m(.)”的形式。其中,x 是一個指向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就稱之為動態(tài)約束。Python中所有方法的調用都是根據(jù)對象所指向對象的類型來動態(tài)的確定(Python變量的語義模型:引用模型)。因此Python所有的方法采用的是動態(tài)約束的方式。3. Python語言的面向對象特征其他問題3. Python語言的面向對象特征其他問題(5) 是否所有方法都采用動態(tài)約束?Python所有的方法采用動態(tài)約束的方式;3. Python語言的面向對象特征其他問題3. P

29、ython語言的面向對象特征其他問題(6) 類類型對象的動態(tài)轉換機制Python的類類型對象之間不提供動態(tài)轉換機制;而是采用名-值(對象)動態(tài)約束機制。3. Python語言的面向對象特征其他問題4. R語言的面向對象特征R語言的面向對象系統(tǒng)基于S3的面向對象編程基于S4的面向對象編程基于RC的面向對象編程基于R6的面向對象編程4. R語言的面向對象特征R語言的面向對象系統(tǒng)4. R語言的面向對象特征面向對象語言必須具有的基本特征封裝數(shù)據(jù)抽象動態(tài)綁定繼承僅具備上述二個或三個的,不能算是面向對象語言。4. R語言的面向對象特征面向對象語言必須具有的基本特征4.1 基于S3的面向對象編程基于S3的面

30、向對象編程是一種泛型函數(shù)的實現(xiàn)方式;泛型函數(shù)是一種特殊的函數(shù),根據(jù)傳入對象的類型決定調研哪個具體的方法;基于S3的面向對象編程,是一種動態(tài)函數(shù)調用的模擬實現(xiàn)。4.1 基于S3的面向對象編程基于S3的面向對象編程4.1 基于S3的面向對象編程對象模型(1) 類的定義在基于S3的面向對象系統(tǒng)中,類是一種類型,任何一個對象,都可以增加這樣一個類型。并且一個對象可以有多種類型;定義的格式如下:attr(對象名, class)-類名“對象名 - structure(屬性, class = 類名)4.1 基于S3的面向對象編程對象模型4.1 基于S3的面向對象編程對象模型(1) 類的定義:方法的定義泛函函

31、數(shù)的定義,格式如下:泛型函數(shù)名 - function(x, .) UseMethod(參數(shù))泛型函數(shù)的分派泛函函數(shù)名.類名-function(參數(shù)) 表達式給類添加行為,格式如下:對象名-泛函函數(shù)名4.1 基于S3的面向對象編程對象模型4.1 基于S3的面向對象編程對象模型:繼承(1) 繼承方式:提供哪些繼承方式?R語言基于S3的面向對象系統(tǒng)有一種非常簡單的繼承方式,用NextMethod()函數(shù)來實現(xiàn) ;其具有單繼承和多重繼承兩種繼承方式;通過對node()函數(shù)傳入n2的參數(shù),node.son()先被執(zhí)行,然后通過NextMethod()函數(shù)繼續(xù)執(zhí)行了node.father()函數(shù)。這樣其實

32、就模擬了,子函數(shù)調用父函數(shù)的過程,實現(xiàn)了面向對象編程中的繼承。單繼承4.1 基于S3的面向對象編程對象模型:繼承通過對node(4.1 基于S3的面向對象編程對象模型:繼承(1) 繼承方式:提供哪些繼承方式?R語言基于S3的面向對象系統(tǒng)有一種非常簡單的繼承方式,用NextMethod()函數(shù)來實現(xiàn) ;其具有單繼承和多重繼承兩種繼承方式;多重繼承4.1 基于S3的面向對象編程對象模型:繼承多重繼承4.1 基于S3的面向對象編程對象模型:繼承(2) 采用基于繼承的模型,還是基于指派的模型?R語言基于S3的面向對象系統(tǒng)是基于指派的模型;4.1 基于S3的面向對象編程對象模型:繼承4.1 基于S3的面

33、向對象編程對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。多態(tài)類屬方法覆蓋4.1 基于S3的面向對象編程對象模型:多態(tài)多態(tài)類屬方法覆蓋4.1 基于S3的面向對象編程對象模型:多態(tài)類屬:方法覆蓋通過泛函函數(shù),實現(xiàn)方法的多態(tài)機制4.1 基于S3的面向對象編程對象模型:多態(tài)通過泛函函數(shù),實4.1 基于S3的面向對象編程其他問題(1) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的存儲區(qū)里;而在變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;R語言中基于S3的面向對象系統(tǒng),采用引用模型;4.1 基于S3的面向對象

34、編程其他問題4.1 基于S3的面向對象編程其他問題(2) 是否允許靜態(tài)對象或者堆棧對象(自動對象)?R語言中基于S3的面向對象系統(tǒng)支持靜態(tài)對象和自動對象;(3) 是否依賴自動廢料收集(GC)?R語言中基于S3的面向對象系統(tǒng)依賴自動廢料收集機制(GC);4.1 基于S3的面向對象編程其他問題4.1 基于S3的面向對象編程其他問題(4) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采用“x. m(.)”的形式。其中,x 是一個指向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就

35、稱之為動態(tài)約束。R語言中基于S3的面向對象系統(tǒng)中所有的方法都采用動態(tài)約束;4.1 基于S3的面向對象編程其他問題4.1 基于S3的面向對象編程其他問題(5) 類類型對象的動態(tài)轉換機制R語言基于S3的面向對象系統(tǒng)中類類型對象之間不提供動態(tài)轉換機制;而是采用名-值(對象)動態(tài)約束機制。4.1 基于S3的面向對象編程其他問題4.1 基于S3的面向對象編程由于基于S3的面向對象編程,并未提供封裝機制。因此,基于S3的面向對象編程不是嚴格意義上的面向對象語言。4.1 基于S3的面向對象編程由于基于S3的面向對象編程,并4.2 基于S4的面向對象編程基于S4的面向對象編程是一種標準的R語言面向對象實現(xiàn)方式

36、;S4對象有明確的類定義,參數(shù)定義,參數(shù)檢查,繼承關系,實例化等的面向對象系統(tǒng)的特征。4.2 基于S4的面向對象編程基于S4的面向對象編程4.2 基于S4的面向對象編程對象模型:封裝(1) 類的定義:在基于S4的面向對象系統(tǒng)中,類定義的格式如下:setClass(Class, representation, prototype, contains=character(),validity, access, where, version, sealed, package,S3methods = FALSE, slots)類的實例化對象名-new(類名,屬性=屬性值,.)4.2 基于S4的面向對象

37、編程對象模型:封裝4.2 基于S4的面向對象編程對象模型:封裝(1) 類的定義:泛型函數(shù)的定義S4的泛型函數(shù)實現(xiàn)有別于S3的實現(xiàn),S4分離了方法的定義和實現(xiàn)。通過setGeneric()來定義接口,通過setMethod()來定義現(xiàn)實類。通過S4對象系統(tǒng),把原來的函數(shù)定義和調用2步,為成了4步進行:1、定義數(shù)據(jù)對象類型;2、定義接口函數(shù);3、定義實現(xiàn)函數(shù);4、 把數(shù)據(jù)對象以參數(shù)傳入到接口函數(shù),執(zhí)行實現(xiàn)函數(shù);4.2 基于S4的面向對象編程對象模型:封裝4.2 基于S4的面向對象編程對象模型:封裝(1) 類的定義泛型函數(shù)的定義4.2 基于S4的面向對象編程對象模型:封裝4.2 基于S4的面向對象編

38、程對象模型:封裝(2) 訪問控制機制:R語言中基于S4的面向對象系統(tǒng),沒有提供訪問控制機制;(3) 對象的獨立性:R語言中對象不具有獨立性,也就是對象必須屬于某一個類;(4) 類本身是不是對象?R語言中基于S4的面向對象系統(tǒng)中,類本身是對象;(5) 基于類的模型,還是基于對象或原型的模型?R語言中基于S4的面向對象系統(tǒng)是基于泛函的模型;4.2 基于S4的面向對象編程對象模型:封裝4.2 基于S4的面向對象編程對象模型:繼承(1) 繼承方式:提供哪些繼承方式?S4有比S3更為嚴格的繼承關系,用contains 參數(shù)表示。其具有單繼承和多重繼承兩種繼承方式;單繼承4.2 基于S4的面向對象編程對象

39、模型:繼承單繼承4.2 基于S4的面向對象編程對象模型:繼承(1) 繼承方式:提供哪些繼承方式?S4有比S3更為嚴格的繼承關系,用contains 參數(shù)表示。其具有單繼承和多重繼承兩種繼承方式;多重繼承4.2 基于S4的面向對象編程對象模型:繼承多重繼承4.2 基于S4的面向對象編程對象模型:繼承(2) 采用基于繼承的模型,還是基于指派的模型?R語言基于S4的面向對象系統(tǒng)是基于指派的模型;4.2 基于S4的面向對象編程對象模型:繼承4.2 基于S4的面向對象編程對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。多態(tài)類屬方法覆蓋4.2 基于S4的面向對象編程對象模型:多態(tài)多

40、態(tài)類屬方法覆蓋4.2 基于S4的面向對象編程對象模型:多態(tài)類屬:方法覆蓋通過泛函函數(shù),實現(xiàn)方法的多態(tài)機制4.2 基于S4的面向對象編程對象模型:多態(tài)通過泛函函數(shù),實4.2 基于S4的面向對象編程其他問題(1) 是不是追求“純粹”的面向對象語言?R語言中的基于S4的面向對象系統(tǒng),不是“純粹”的面向對象語言:1) 存在全局變量和全局函數(shù);2) main函數(shù)不是類的方法;3) 但, R語言中的基于S4的面向對象系統(tǒng)中,一切皆為對象。4.2 基于S4的面向對象編程其他問題4.2 基于S4的面向對象編程其他問題(2) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的存儲區(qū)里;而在

41、變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;R語言中基于S4的面向對象系統(tǒng),采用引用模型;4.2 基于S4的面向對象編程其他問題4.2 基于S4的面向對象編程其他問題(3) 是否允許靜態(tài)對象或者堆棧對象(自動對象)?R語言中基于S4的面向對象系統(tǒng)支持靜態(tài)對象和自動對象;(4) 是否依賴自動廢料收集(GC)?R語言中基于S4的面向對象系統(tǒng)依賴自動廢料收集機制(GC);4.2 基于S4的面向對象編程其他問題4.2 基于S4的面向對象編程其他問題(5) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采用“x. m(.)”的形式。其中,x 是一個指

42、向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就稱之為動態(tài)約束。R語言中基于S4的面向對象系統(tǒng)中所有的方法都采用動態(tài)約束;4.2 基于S4的面向對象編程其他問題4.2 基于S4的面向對象編程其他問題(6) 類類型對象的動態(tài)轉換機制R語言基于S4的面向對象系統(tǒng)中類類型對象之間不提供動態(tài)轉換機制;而是采用名-值(對象)動態(tài)約束機制。4.2 基于S4的面向對象編程其他問題4.3 基于RC的面向對象編程基于RC的面向對象編程RC對象系統(tǒng)從底層上改變了原有S3和S4對象系統(tǒng)的設計,去掉了泛型函

43、數(shù);真正地以類為基礎實現(xiàn)面向對象的特征。4.3 基于RC的面向對象編程基于RC的面向對象編程4.3 基于RC的面向對象編程對象模型:封裝(1) 類的定義定義的格式如下:setRefClass(Class, fields = , contains = , methods =, where =, .)Class: 定義類名fields: 定義屬性和屬性類型contains: 定義父類,繼承關系methods: 定義類中的方法where: 定義存儲空間4.3 基于RC的面向對象編程對象模型:封裝Class: 定4.3 基于RC的面向對象編程對象模型:封裝(1) 類的定義4.3 基于RC的面向對象編程

44、對象模型:封裝4.3 基于RC的面向對象編程對象模型:封裝(2) 訪問控制機制:R語言中基于RC的面向對象系統(tǒng),沒有提供訪問控制機制;(3) 對象的獨立性:R語言中對象不具有獨立性,也就是對象必須屬于某一個類;(4) 類本身是不是對象?R語言中基于RC的面向對象系統(tǒng)中,類本身是對象;(5) 基于類的模型,還是基于對象或原型的模型?R語言中基于RC的面向對象系統(tǒng)是基于對象的模型;4.3 基于RC的面向對象編程對象模型:封裝4.3 基于RC的面向對象編程對象模型:繼承(1) 類層次結構:采用單根的類層次結構,還是任意的類層次結構?R語言基于RC的面向對象系統(tǒng)采用任意的類層次結構;4.3 基于RC的

45、面向對象編程對象模型:繼承4.3 基于RC的面向對象編程對象模型:繼承(2) 繼承方式:提供哪些繼承方式?R語言基于RC的面向對象系統(tǒng)沿用R4的繼承方式,用contains 參數(shù)表示;其具有單繼承和多重繼承兩種繼承方式;單繼承4.3 基于RC的面向對象編程對象模型:繼承單繼承4.3 基于RC的面向對象編程對象模型:繼承(2) 繼承方式:提供哪些繼承方式?R語言基于RC的面向對象系統(tǒng)沿用R4的繼承方式,用contains 參數(shù)表示;其具有單繼承和多重繼承兩種繼承方式;多重繼承4.3 基于RC的面向對象編程對象模型:繼承多重繼承4.3 基于RC的面向對象編程對象模型:繼承(3) 采用基于繼承的模型

46、,還是基于指派的模型?R語言基于RC的面向對象系統(tǒng)是基于繼承的模型;4.3 基于RC的面向對象編程對象模型:繼承4.3 基于RC的面向對象編程對象模型:多態(tài)多態(tài):是指同樣的消息被不同類型的對象接收時導致不同的行為。多態(tài)類屬方法覆蓋4.3 基于RC的面向對象編程對象模型:多態(tài)多態(tài)類屬方法覆蓋4.3 基于RC的面向對象編程對象模型:多態(tài)類屬:方法覆蓋4.3 基于RC的面向對象編程對象模型:多態(tài)4.3 基于RC的面向對象編程其他問題(1) 是不是追求“純粹”的面向對象語言?R語言中的基于RC的面向對象系統(tǒng),接近“純粹”的面向對象語言:1) 不存在全局變量和全局函數(shù);2) 但,main函數(shù)不是類的方法

47、;3) R語言中的基于RC的面向對象系統(tǒng)中,一切皆為對象。4.3 基于RC的面向對象編程其他問題4.3 基于RC的面向對象編程其他問題(2) 變量的語義模型:采用值模型還是引用模型?在變量的值模型中,值保存在變量的存儲區(qū)里;而在變量的引用模型中,變量的值需要用另一個值對象表示,變量的存儲區(qū)里存放的是對值對象的引用;R語言中基于RC的面向對象系統(tǒng),采用引用模型;4.3 基于RC的面向對象編程其他問題4.3 基于RC的面向對象編程其他問題(3) 是否允許靜態(tài)對象或者堆棧對象(自動對象)?R語言中基于RC的面向對象系統(tǒng)支持靜態(tài)對象和自動對象;(4) 是否依賴自動廢料收集(GC)?R語言中基于RC的面

48、向對象系統(tǒng)依賴自動廢料收集機制(GC);4.3 基于RC的面向對象編程其他問題4.3 基于RC的面向對象編程其他問題(5) 是否所有方法都采用動態(tài)約束?面向對象語言里的方法調用通常采用“x. m(.)”的形式。其中,x 是一個指向或者引用對象的變量,m是x的定義類型的一個方法。如果是根據(jù)變量x的類型靜態(tài)確定,我們就稱之為靜態(tài)約束;如果是根據(jù)方法調用時被指向或引用的對象的類型確定,我們就稱之為動態(tài)約束。R語言中基于RC的面向對象系統(tǒng)中所有的方法都采用動態(tài)約束;4.3 基于RC的面向對象編程其他問題4.3 基于RC的面向對象編程其他問題(6) 類類型對象的動態(tài)轉換機制R語言基于RC的面向對象系統(tǒng)中類類型對象之間不提供動態(tài)轉換機制;而是采用名-值(對象)動態(tài)約束機制。4.3 基于RC的面向對象編程其他問題4.4 基于R6的面向對象編程基于R6的面向對象編程R6類型非常接近于RC類型(Reference classes),但比RC類型更輕;由于R6不依賴于S4的對象系統(tǒng),所以用R6的構建面向對象系統(tǒng)會更加有效率。4.4 基于R6的面向對象編程基于R6的面向對象編程4.4 基于R6的面向對象編程對象模型:封裝(1) 類的定義在基于R6的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論