【正文】
有辦法體現(xiàn)多態(tài)和替換原則的 (請(qǐng)思考一下在 C++中什么對(duì)象是基于棧的 ),而基于 3內(nèi)存模型的對(duì)象將支持多態(tài)和替換原則 (又想一想 在 C++中什么對(duì)象是基于堆的 )。 對(duì)于上面提到的三種內(nèi)存模型, 1 和 3都被 一些程序設(shè)計(jì)語言所采用。 3,只分配用于保存一個(gè)指針?biāo)枰拇鎯?chǔ)空間,在運(yùn)行時(shí)通過堆來分配對(duì)象實(shí)際類型所需要的空間大小,這樣也可以實(shí)現(xiàn)多態(tài)和替換原則而避免對(duì)象切割問題。這樣的模型內(nèi)存分配緊湊,存儲(chǔ)效率很高。然而這并不是我們所期望的。這是一種直觀的描敘,但在編程語言的實(shí)現(xiàn)過程中就出現(xiàn) 一些困難。同時(shí),我們創(chuàng)建 people 的子類 man,由于 man IS Apeople。下面,我將試圖逐步的撥開其中的各種因果。 Barbara Liskov 曾經(jīng)這樣描敘替換原則以及起作用的類型之間的關(guān)聯(lián):對(duì)于類型為 S的每個(gè)對(duì)象 s,存在一個(gè)類型為 T的對(duì)象 t,對(duì)于根據(jù)類型 T所定義的所有程序 P,如果用對(duì)象 s替換對(duì)象 t,程序 P的行為保持不變,那么類型 S就是類型 T的子類型 [Liskov 1988] 在理解了多態(tài)以及替換原則后,我們可以繼續(xù)深入理解繼承與替換原則相結(jié)合所帶 來的新的觀點(diǎn)。靜態(tài)類型的 OOPL 的一個(gè)特征就是一個(gè)變量所包含的值 (value)的類型可能并不等于這個(gè)變量所聲 明的類型,在傳統(tǒng)的編程語言中并不具備這樣的特征,因?yàn)槲覀儾豢赡馨崖暶鳛檎偷淖兞抠x上字符串的變量值。在這里,我們重點(diǎn)要考量的是對(duì)象變量多態(tài)。函數(shù)多態(tài)主要包括函數(shù)重載 (overload)和改寫 (overriding)。顧名思義,多態(tài)就是一種名稱多種形態(tài)的意思。一個(gè)類可以有多個(gè)接口 (一個(gè)類完全有可 能實(shí)現(xiàn)了設(shè)計(jì)人員的多個(gè)契約條件 ),同時(shí)也就可能有多個(gè)類型 (因?yàn)轭愋筒贿^是接口這個(gè)設(shè)計(jì)域內(nèi)的概念在編譯器中的實(shí)現(xiàn) )。編譯器所能理解的全部都是類型,而程序員的工作是把現(xiàn)實(shí)中的類概念轉(zhuǎn)化為設(shè)計(jì)中的接口概念,而編譯器對(duì)應(yīng)于上兩種概念都有直接的支持,那就是一個(gè)類聲明或者接口聲明在編譯器的理解來看就是一個(gè)類型聲明。再讓我們回到 [Jams 2021],其中句子的根本含義我們可以概括如下:聲明一個(gè)類或者一個(gè)接口都同時(shí)向編譯器注冊(cè)了一個(gè)新的類型,而此類或者接口以及類型都是共享同樣的一個(gè)名字。這三個(gè)概念相互區(qū)別 (分別位于不同的概念域 ),又相互聯(lián)系 (都是代表相同的概念的不同概念域的映射 )。而類型是類和接口這兩種概念的編譯器實(shí)現(xiàn)的映射概念,也是唯物的??梢赃@樣說,類是現(xiàn)實(shí)世界中存在的客觀概念,是唯物的。在 OO 設(shè)計(jì)中,我們所要做的就是針對(duì)接口進(jìn)行設(shè)計(jì)和編程,而接口的實(shí)質(zhì)含義就是對(duì)象之間的一種契約。由此,我們可以這樣說,類是做為現(xiàn)實(shí)世界中的概念,而傳統(tǒng)的 OOPL 都會(huì)提供 class 關(guān)鍵字來表示對(duì)現(xiàn)實(shí)世界模擬的支持。為了理解這幾個(gè)概念,我先劃分出三個(gè)概念域:一個(gè)是針對(duì)現(xiàn)實(shí)世界的,一個(gè)是針對(duì)特定程序設(shè)計(jì)范型的 (在這里就是 OO 設(shè)計(jì)范型 ),最后一個(gè)是針對(duì) 編譯器實(shí)現(xiàn)的。s interface may be characterized by one type,and other parts by other objects of the same type need only share parts of their can contain other interface as say that atype is asubtype of another if its interface contain the interface of its we speak of asubtype inheriting the interface of its supertype[Gamma 1995] 在其中,一共出現(xiàn)了四個(gè)概念:類 (class),類型 (type),接口 (interface)以及契約 (contract)。 In C++,A class is auser definite type[ 1998]。而對(duì)于這三個(gè)概念的澄清也是文章寫作的初衷。在這里,我們不想深入的探究對(duì)于類型理論的各種不同的數(shù)學(xué)模型,我們需要明白的是類型 (type)以及類型理論這個(gè)在編程語言中經(jīng)常應(yīng)用到的概念 的內(nèi)涵是極其豐富的,而其自身理論的發(fā)展并非局限于 OOP 之中,但當(dāng)兩者相結(jié)合的時(shí)候就對(duì)我們的程序觀產(chǎn)生了巨大的影響。同時(shí)在此基礎(chǔ)上二階λ演算已經(jīng)被用于繼承和模板所支持的模型。而代數(shù)方法 (algebraic approach)是一種非常好的建立類型的形式化規(guī) 范的方法。而在對(duì)類型的研究過程中產(chǎn)生多種方法,比如 [Camp。