版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-Smalltalk程序語(yǔ)言

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶(hù)提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

面向?qū)ο蟮幕咎攸c(diǎn)

Simula包含了大量我們現(xiàn)在仍在使用的面向?qū)ο蟮奶攸c(diǎn),除了前面提到的類(lèi)、對(duì)象以外,還有以下特點(diǎn):

一 動(dòng)態(tài)查找選擇對(duì)象的活動(dòng)記錄操作;2

一 抽象在Simula晚期版本中具備,但在Simula 67中沒(méi)有;

一 子類(lèi)型源于類(lèi)型與類(lèi)相關(guān)的方式;

一 繼承類(lèi)向前兼容的形式,包括在子類(lèi)中重新定義類(lèi)的一部分。

盡管Simula 67中沒(méi)有區(qū)別類(lèi)的public和private機(jī)制。但晚期語(yǔ)言允許使用“protected”,它允許子類(lèi)型可見(jiàn)(其他類(lèi)不允許使用),以及“hidden”,即使子類(lèi)也不能只用它。除了以上特點(diǎn)外,Simula還包含了一些其他大多數(shù)面向?qū)ο笳Z(yǔ)言不包含的以下特點(diǎn):

一 inner使用inner關(guān)鍵字,子類(lèi)還可以調(diào)用相關(guān)父類(lèi)的代碼;

■ inspect和qua在運(yùn)行中可以測(cè)試對(duì)象類(lèi)型,從而執(zhí)行相應(yīng)類(lèi)型的代碼。inspect是強(qiáng)類(lèi)型語(yǔ)言,而qua是正確性檢查及類(lèi)型校驗(yàn)。

所有這些特點(diǎn)在接下來(lái)的章節(jié)中都將進(jìn)行詳細(xì)討論,一些在其他語(yǔ)言中出現(xiàn)而沒(méi)有在早期的Simula版本中出現(xiàn)的有:多重繼承、類(lèi)變量和self/super機(jī)制。

基本特征五個(gè)概念要理解Smalltalk首先必須理解五個(gè)概念,即對(duì)象(object)、消息(message)、類(lèi)(class)、實(shí)例(instance)和方法(method),它們是互相以一種循環(huán)的方式來(lái)定義的。只要理解了這五個(gè)概念,Smalltalk的其余部分也就非常好理解了。

對(duì)象——在Smalltalk中,任何東西都是對(duì)象,數(shù)據(jù)結(jié)構(gòu)、物理裝置、概念、文件、可執(zhí)行程序段、以及源代碼程序段都是對(duì)象,連支持環(huán)境的組成部分,如編譯工具和調(diào)試工具等也都是對(duì)象。一切都需要按對(duì)象和對(duì)象行為的方式來(lái)思考和行動(dòng)。

類(lèi)——類(lèi)是定義某種對(duì)象特性的對(duì)象。類(lèi)有名字,它表明了它所代表的對(duì)象的類(lèi)型。由某個(gè)類(lèi)代表的對(duì)象被稱(chēng)作該類(lèi)的實(shí)例。類(lèi)按超類(lèi)、子類(lèi)層次排列,其中子類(lèi)是比超類(lèi)更特殊的類(lèi),它能繼承超類(lèi)的特性。類(lèi)的協(xié)議描述提供了建立該類(lèi)的實(shí)例的途徑。對(duì)象所能響應(yīng)的所有動(dòng)作均在它的類(lèi)描述中定義。

實(shí)例——實(shí)例是某個(gè)類(lèi)對(duì)象,它的特性由該類(lèi)的協(xié)議描述來(lái)定義。實(shí)例所能響應(yīng)的動(dòng)作由它的類(lèi)協(xié)議定義。

消息——消息是發(fā)送給某個(gè)對(duì)象的動(dòng)作標(biāo)識(shí)符。它指示對(duì)象執(zhí)行某些動(dòng)作。只有當(dāng)消息包含在某個(gè)對(duì)象的類(lèi)協(xié)議描述中時(shí),該對(duì)象才能響應(yīng)該消息。某個(gè)類(lèi)的實(shí)例能響應(yīng)的所有消息都必須在該類(lèi)或它的超類(lèi)的協(xié)議描述中定義。消息可由類(lèi)從它的超類(lèi)中繼承。

方法——方法是消息的詳細(xì)實(shí)現(xiàn)。類(lèi)的協(xié)議描述應(yīng)包括它的實(shí)例所能響應(yīng)的每個(gè)消息的方法細(xì)節(jié)。方法精確地定義了對(duì)象如何響應(yīng)消息。3

抽象在Smalltalk中的對(duì)象是抽象的封裝體。抽象包括數(shù)據(jù)抽象和功能抽象。數(shù)據(jù)抽象的形式主要是私有和共享數(shù)據(jù),它們定義了對(duì)象的特性。而功能抽象則采用了方法的形式,這些方法給出了某個(gè)對(duì)象如何響應(yīng)消息的細(xì)節(jié)。對(duì)象所能響應(yīng)的每個(gè)消息都對(duì)應(yīng)著一個(gè)方法。

任何對(duì)象都是某個(gè)類(lèi)的實(shí)例。而每個(gè)類(lèi)都有名字并代表一種類(lèi)型的對(duì)象??梢杂媒o類(lèi)名發(fā)送一條實(shí)例創(chuàng)建消息的方式來(lái)建立對(duì)象。某個(gè)對(duì)象的所有數(shù)據(jù)抽象和功能抽象均在其類(lèi)描述協(xié)議中定義,包括用于實(shí)例創(chuàng)建的消息、私有數(shù)據(jù)、共享數(shù)據(jù)和方法。

最一般的對(duì)象是由一個(gè)稱(chēng)作為Object的類(lèi)所代表的對(duì)象。Object是Smalltalk系統(tǒng)中所有其他類(lèi)的超類(lèi)。它的類(lèi)描述協(xié)議包括消息和相應(yīng)的方法、私有和共享數(shù)據(jù)、以及實(shí)例創(chuàng)建方法,這一切對(duì)于任何對(duì)象都是共同的。然而只要需要,子類(lèi)也可以重載Object的任何方法、增加新的私有和共享數(shù)據(jù)。

在開(kāi)發(fā)象Smalltalk這樣的軟件系統(tǒng)的過(guò)程中,定義它所支持的對(duì)象種類(lèi)以及其相應(yīng)的功能抽象是最主要的工作。Smalltalk映像是由200多種類(lèi)組成的,這些類(lèi)按照類(lèi)別和依賴(lài)關(guān)系組成一個(gè)類(lèi)層次。在映像中有些類(lèi)是抽象類(lèi),它們有以下特性:

(1)沒(méi)有任何對(duì)象是抽象類(lèi)的實(shí)例,它們只能是抽象類(lèi)的子類(lèi)的實(shí)例;

(2)抽象類(lèi)中的方法代表他的所有子類(lèi)的公共協(xié)議。子類(lèi)可以重載方法和增加新的數(shù)據(jù);

(3)抽象類(lèi)提供了一個(gè)邏輯層次組織。

例如,在smalltalk系統(tǒng)中只有兩個(gè)Boolean對(duì)象。對(duì)象true是類(lèi)True的唯一實(shí)例,對(duì)象falSe是類(lèi)False的唯一實(shí)例。一個(gè)布爾表達(dá)式(比較或測(cè)試)的結(jié)果或是對(duì)象true或是對(duì)象false。對(duì)象tfue和faIse中的哪一個(gè)響應(yīng)消息形成了smalltalk中控制的基礎(chǔ)。

在smalltalk映像中類(lèi)True和False是類(lèi)Boolean的子類(lèi)。Boolean沒(méi)有實(shí)例,只是用來(lái)定義True和False的公共協(xié)議,因此Boolean是一個(gè)抽象類(lèi)。在該映像中還存在其他的抽象類(lèi)。

類(lèi)True和False的協(xié)議描述列出了幾個(gè)消息以及相應(yīng)的用于控制的方法(功能抽象)。

封裝smalltalk中對(duì)象的封裝是基于個(gè)別對(duì)象的類(lèi)描述協(xié)議的。特定類(lèi)的協(xié)議定義了它的實(shí)例(對(duì)象)的特性。對(duì)象的特性包括描述性參數(shù)(其他對(duì)象)和對(duì)象如何響應(yīng)消息的細(xì)節(jié)。

類(lèi)描述協(xié)議包括許多基本元素,但并不是每個(gè)類(lèi)都有所有這些元素。是否具有私有數(shù)據(jù)或共享數(shù)據(jù)依賴(lài)于該類(lèi)所代表的對(duì)象的性質(zhì)。方法的數(shù)量和類(lèi)型依賴(lài)于該類(lèi)的對(duì)象所必須響應(yīng)的功能抽象有多么復(fù)雜和豐富。以下是類(lèi)描述協(xié)議的基本元素:

定義——一段表明該類(lèi)在類(lèi)層次中位置的敘述,它同時(shí)也列出該類(lèi)中私有、共享和公用數(shù)據(jù)對(duì)象的標(biāo)識(shí)符。

私有數(shù)據(jù)——其值為該類(lèi)的個(gè)別實(shí)例擁有的描述性參數(shù)(對(duì)象)。私有數(shù)據(jù)實(shí)例變量表示它只能由實(shí)例方法訪問(wèn)。如何訪問(wèn)私有數(shù)據(jù)對(duì)象由每個(gè)對(duì)象的類(lèi)的協(xié)議決定。

共享數(shù)據(jù)——其值為該類(lèi)的所有實(shí)例共享的描述性參數(shù)(對(duì)象)。共享數(shù)據(jù)由類(lèi)變量表示,它可由實(shí)例方法和類(lèi)方法兩者訪問(wèn)。因此訪問(wèn)細(xì)節(jié)是由每個(gè)對(duì)象的類(lèi)的協(xié)議控制的。

公用數(shù)據(jù)——其值為多個(gè)類(lèi)共享的描述性參數(shù)(對(duì)象)。對(duì)公用數(shù)據(jù)的訪問(wèn)必須在類(lèi)描述協(xié)議中特別表示出來(lái)。公用數(shù)據(jù)是用pool dictionaries表示的,因此,可由實(shí)例方法和類(lèi)方法兩者訪問(wèn)。但是,由于公用數(shù)據(jù)也是另一個(gè)類(lèi)的實(shí)例,訪問(wèn)將受到該類(lèi)提供的消息的限制。

實(shí)例方法——某個(gè)類(lèi)的實(shí)例能響應(yīng)的消息的實(shí)現(xiàn)細(xì)節(jié)。這些方法所代表的消息只能發(fā)給該類(lèi)的實(shí)例。

類(lèi)方法——某個(gè)類(lèi)能響應(yīng)的消息的實(shí)現(xiàn)細(xì)節(jié)。這些方法所代表的消息只能發(fā)該類(lèi)名。類(lèi)方法的典型用途是初始化類(lèi)變量、創(chuàng)建某類(lèi)的實(shí)例等。

繼承面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言的要求之一就是必須支持繼承。繼承只有在類(lèi)按層次排列時(shí)才有意義。子類(lèi)繼承超類(lèi)的某些東西,包括私有數(shù)據(jù)、共享數(shù)據(jù)、實(shí)例方法和類(lèi)方法。子類(lèi)繼承它的一切先輩,從直接超類(lèi)一直到類(lèi)Object。

如果某個(gè)子類(lèi)沒(méi)有任何同它的超類(lèi)不同協(xié)議(包括數(shù)據(jù)和方法),它就沒(méi)有存在的必要。因此子類(lèi)必須有某些新的數(shù)據(jù)和方法。同時(shí),子類(lèi)也可以重新定義從它的超類(lèi)繼承來(lái)的方法,這種情況稱(chēng)為方法的重載,它是一種多態(tài)性。

smalltalk的繼承規(guī)則如下:

(1)某個(gè)子類(lèi)只從它的超類(lèi)層次鏈上繼承,從直接超類(lèi)一直到類(lèi)ob_ject;

(2)所有的類(lèi)都是類(lèi)object的子類(lèi),除了類(lèi)object本身以外。類(lèi)object沒(méi)有超類(lèi);

(3)超類(lèi)不繼承子類(lèi);

(4)支持多重繼承,這意味著一個(gè)類(lèi)可被聲明是一個(gè)以上層次鏈的子類(lèi),并且可以繼承每個(gè)層次鏈的特性;

(5)一個(gè)子類(lèi)可從它的超類(lèi)繼承私有數(shù)據(jù)、共享數(shù)據(jù)、實(shí)例方法和類(lèi)方法;

(6)對(duì)繼承的協(xié)議而言,訪問(wèn)私有和共享數(shù)據(jù)的規(guī)則同類(lèi)描述協(xié)議的相同;

(7)除了繼承的協(xié)議以外,子類(lèi)還可以增加新的協(xié)議;

(8)子類(lèi)可重載繼承的實(shí)例和類(lèi)方法。

多態(tài)性smalltalk中消息選擇器的范圍限于每個(gè)類(lèi)和它的子類(lèi)的類(lèi)協(xié)議描述。這樣,相同的消息選擇器可存在于許多類(lèi)中。當(dāng)消息發(fā)送給對(duì)象時(shí),其意義是由該對(duì)象所屬類(lèi)的協(xié)議描述所確定的。不同對(duì)象響應(yīng)同一個(gè)消息選擇器的能力稱(chēng)為多態(tài)性。

通過(guò)允許同一個(gè)消息選擇器(表明一個(gè)特定的動(dòng)作)被發(fā)送給不同對(duì)象,多態(tài)性大大地增強(qiáng)了軟件的可讀性。例如,消息printon:可發(fā)送給smalltalk系統(tǒng)中的任何對(duì)象,唯一的要求是printon:的細(xì)節(jié)必須包括在該對(duì)象所屬類(lèi)的層次路徑上。從概念上來(lái)講,printon:表明了一個(gè)特定的動(dòng)作。這個(gè)概念對(duì)任何對(duì)象都是相同的,只是實(shí)現(xiàn)細(xì)節(jié)不同。

類(lèi)協(xié)議由于類(lèi)也是對(duì)象,因此它也有類(lèi),定義了一個(gè)metaclass。

metadass(元類(lèi))是一個(gè)類(lèi)的類(lèi),它是唯一的且有著不同于其他類(lèi)的特性。每當(dāng)定義一個(gè)新類(lèi)時(shí),其元類(lèi)自動(dòng)被定義。每個(gè)類(lèi)可以有不同的元類(lèi),這一事實(shí)使得所有的類(lèi)無(wú)需有相同的協(xié)議。元類(lèi)的主要特性如下:

在smalltalk映像中,每個(gè)類(lèi)只有一個(gè)元類(lèi)。

每個(gè)元類(lèi)只有一個(gè)實(shí)例,即它所相應(yīng)的那個(gè)類(lèi)。

一個(gè)“類(lèi)”對(duì)象的協(xié)議是包含在它的元類(lèi)中的。類(lèi)變量和類(lèi)方法是一個(gè)類(lèi)的元素協(xié)議描述的一部分。為了方便起見(jiàn),將類(lèi)描述和元類(lèi)描述組合了起來(lái)。這兩者均可用系統(tǒng)瀏覽器(system Browser)觀察和修改。

任何一個(gè)元素并不是另一個(gè)元素的實(shí)例。相反,所有的元類(lèi)都是一個(gè)叫做Meta—class類(lèi)的實(shí)例。MetaclaSs是映像層次的一部分。

由于Metaclass是類(lèi)(不是元素),它也有元素。Metaclass的元類(lèi)也是Metaclass的實(shí)例。 .

一個(gè)名叫class的類(lèi)是所有元素的抽象超類(lèi)。對(duì)元類(lèi)而言,它起的作用就象object對(duì)類(lèi)起的作用是一樣的。同時(shí)Class也是元類(lèi),也是Metaclass的實(shí)例。

元類(lèi)也有一個(gè)層次,除了層次高一些以外,同類(lèi)層次完全匹配。記住,Object是所有其他類(lèi)的超類(lèi),包括元類(lèi)。

繼承和多態(tài)性規(guī)則同樣適用于元類(lèi)。

對(duì)象對(duì)象是一種可以循環(huán)描述的數(shù)據(jù)結(jié)構(gòu),每個(gè)對(duì)象都是某個(gè)類(lèi)的實(shí)例。一個(gè)對(duì)象所屬的類(lèi)可以通過(guò)對(duì)其發(fā)送所有的對(duì)象都能理解的消息class來(lái)確定。

對(duì)象是封裝的數(shù)據(jù)結(jié)構(gòu),儲(chǔ)存在一個(gè)對(duì)象內(nèi)部的數(shù)據(jù)只能通過(guò)消息來(lái)存取,但對(duì)象可以共享。

方法中的字self是指調(diào)用這個(gè)方法的消息的接受者。

變量smalltalk變量是用來(lái)存放對(duì)象的,方法是存儲(chǔ)對(duì)象的指針。在表達(dá)式中,變量名可用來(lái)表示一個(gè)對(duì)象,方式是存儲(chǔ)該對(duì)象的指針。變量在不同的時(shí)刻可存放不同對(duì)象的指針。當(dāng)執(zhí)行一個(gè)賦值表達(dá)式時(shí),存放在變量中的對(duì)象指針可能發(fā)生改變。賦值語(yǔ)句只拷貝對(duì)象的指針而不是對(duì)象本身。

變量有私有的和共享的兩種。私有變量只能由單個(gè)對(duì)象訪問(wèn),以小寫(xiě)字母開(kāi)頭;共享變量可被多個(gè)對(duì)象訪問(wèn),以大寫(xiě)字母開(kāi)頭。

變量共有三種類(lèi)型:

(1)實(shí)例變量是對(duì)象的組成部分,它們?cè)趯?duì)象的整個(gè)生存期都存在;

(2)暫時(shí)變量是在某個(gè)方法執(zhí)行時(shí)創(chuàng)建的,它們只在該方法執(zhí)行的時(shí)間內(nèi)存在;

(3)共享變量可由許多對(duì)象共享。如果不刪除,它們將始終存在于系統(tǒng)之中。

實(shí)例變量每個(gè)對(duì)象都保存其內(nèi)部狀態(tài),一個(gè)對(duì)象的私有存儲(chǔ)器由只供自己訪問(wèn)的稱(chēng)為實(shí)例變量的部分組成。實(shí)例變量類(lèi)似于其他語(yǔ)言中一個(gè)記錄結(jié)構(gòu)的域,或者是有一個(gè)名字或者是用一個(gè)整數(shù)索引來(lái)引用。有名實(shí)例變量可以通過(guò)其名字來(lái)訪問(wèn),索引實(shí)例變量只能通過(guò)消息來(lái)訪問(wèn)(一般是at:put:帶整數(shù)索引值)。類(lèi)的每個(gè)成員都有自己的實(shí)例變量。

實(shí)例變量具有三種類(lèi)型,即指針型、字型和字節(jié)型。屬于同一個(gè)類(lèi)的對(duì)象的所有實(shí)例變量具有同一種類(lèi)型。大多數(shù)對(duì)象的實(shí)例變量用來(lái)存放指針,這個(gè)指針指向該對(duì)象。如果一個(gè)對(duì)象存放字或字節(jié),則它的實(shí)例變量分別存放16位或8位值來(lái)表示基本的數(shù)據(jù)。

類(lèi)對(duì)其成員對(duì)象既可以聲明有名實(shí)例變量也可以聲明索引實(shí)例變量。對(duì)于一個(gè)類(lèi)的所有成員來(lái)說(shuō),有名實(shí)例變量的名字和數(shù)目是固定的。在同一個(gè)類(lèi)的成員中索引變量的數(shù)目可以不同。例如:#(1 2 3)和#(up``down)都是類(lèi)Array的對(duì)象,但是它們的索引實(shí)例變量的數(shù)目不同,分別是3和2。具有索引實(shí)例變量的類(lèi)用指定創(chuàng)建索引實(shí)例變量數(shù)目的消息來(lái)創(chuàng)建其新成員(一般使用帶有一個(gè)整數(shù)變?cè)南ew:)。許多對(duì)象可用消息size返回其索引實(shí)例變量的數(shù)目。

只有調(diào)用了某個(gè)方法的消息的接受者的實(shí)例變量才可以用名字來(lái)表示。

暫時(shí)變量暫時(shí)變量包括方法變?cè)?、方法暫時(shí)變?cè)约按a塊中的塊變?cè)?/p>

方法變?cè)毁x予調(diào)用該方法的消息的變?cè)?。方法暫時(shí)變?cè)诜椒ㄕ{(diào)用時(shí)被初始化為nil,塊變?cè)毁x予代碼塊執(zhí)行時(shí)消息value:的變?cè)?/p>

共享變量共享變量在共享字典集中定義,不同種類(lèi)的共享變量在不同的共享字典中定義。所有的共享變量名都以大寫(xiě)字母開(kāi)頭,變量名和變量值一起放在一個(gè)Association對(duì)象中,這個(gè)對(duì)象也是放在共享字典中的。

系統(tǒng)字典Smalltalk是包含所有全局變量的共享字典,全局變量可被任何對(duì)象訪問(wèn)。

每一個(gè)類(lèi)的類(lèi)變量隱含地收集在相應(yīng)類(lèi)的共享字典中,類(lèi)變量是作為類(lèi)的規(guī)格說(shuō)明的一部分來(lái)定義的。類(lèi)變量只對(duì)本類(lèi)、本類(lèi)的子類(lèi)、本類(lèi)的實(shí)例和本類(lèi)的子類(lèi)的實(shí)例是可訪問(wèn)的。

共享字典變量也包含在共享字典中,它是全局變量。要使共享字典變量對(duì)某個(gè)類(lèi)及其實(shí)例是可訪問(wèn)的,用戶(hù)必須修改這個(gè)類(lèi)的規(guī)格說(shuō)明。

類(lèi)類(lèi)是Smalltalk的程序模塊,它描述了數(shù)據(jù)結(jié)構(gòu)(對(duì)象)、算法(方法)和外部接口(消息協(xié)議),因此提供了完整的問(wèn)題求解能力。

每個(gè)對(duì)象都是某個(gè)類(lèi)的實(shí)例,一個(gè)類(lèi)的所有實(shí)例具有相同的結(jié)構(gòu)(即:相同的實(shí)例變量,能夠響應(yīng)相同的消息,可用相同的方法)。

類(lèi)也是對(duì)象,它存儲(chǔ)在Smalltalk系統(tǒng)字典中的全局變量中。類(lèi)名以大寫(xiě)字母開(kāi)頭,以便類(lèi)可在表達(dá)式中引用。

類(lèi)層次所有的類(lèi)形成一個(gè)類(lèi)層次,它由一個(gè)稱(chēng)為Object的根類(lèi)和許多子類(lèi)組成。每個(gè)類(lèi)繼承其超類(lèi)的功能。類(lèi)Object提供了所有對(duì)象所共有的行為,它包括對(duì)象標(biāo)識(shí)符的打印方法、測(cè)試對(duì)象的類(lèi)的方法以及拷貝對(duì)象的方法。每個(gè)子類(lèi)都在其超類(lèi)的基礎(chǔ)上,通過(guò)添加自己的方法和實(shí)例變量來(lái)實(shí)現(xiàn)它自己的行為。

繼承一個(gè)類(lèi)繼承其超類(lèi)的所有的實(shí)例變量、類(lèi)變量和方法。類(lèi)變量的繼承是指允許某個(gè)類(lèi)定義的方法引用其超類(lèi)定義的類(lèi)變量。實(shí)例變量的繼承是指允許某個(gè)類(lèi)定義的方法引用其超類(lèi)定義的實(shí)例變量,但是它還意味著這個(gè)類(lèi)的實(shí)例對(duì)象中包括其超類(lèi)的實(shí)例變量。

要確定方法能完成何種功能可通過(guò)兩條信息來(lái)判斷,即消息的選擇器和消息接受對(duì)象的類(lèi)。

首先,檢查是否存在接受對(duì)象的類(lèi)可用的方法,看一看是否該類(lèi)中存在一個(gè)匹配這個(gè)消息選擇器的方法,如果存在,則執(zhí)行這個(gè)方法,如果不存在,則在接受對(duì)象的類(lèi)的超類(lèi)中再檢查是否存在一個(gè)匹配這個(gè)消息的選擇器。重復(fù)這一過(guò)程直到找到這個(gè)方法或到達(dá)層次鏈的頂端為止。在后一種情況下,出現(xiàn)編輯錯(cuò)誤并且一個(gè)描述這種錯(cuò)誤的消息被送到原來(lái)消息的接受對(duì)象上。

這里有一個(gè)接受對(duì)象的特殊的句法形式——super,它改變了消息查找的起始類(lèi),字super有兩個(gè)含義:

(1)它同self表示的是同一個(gè)對(duì)象,引起含有super的方法執(zhí)行的t削息的接受對(duì)象;

(2)它使消息查找從含有super在其中出現(xiàn)的方法的類(lèi)的超類(lèi)開(kāi)始,而不是從接受對(duì)象的類(lèi)開(kāi)始。

向super發(fā)送消息的主要目的是能夠使用在超類(lèi)中的一個(gè)方法,該方法在其子類(lèi)中是重新定義的。

類(lèi)消息發(fā)送到類(lèi)對(duì)象的消息是用來(lái)創(chuàng)建該類(lèi)的一個(gè)實(shí)例和初始化類(lèi)變量,最普通的創(chuàng)建一個(gè)新實(shí)例的消息是new和new:,有些類(lèi)定義自己的創(chuàng)建實(shí)例的消息。

同所有的對(duì)象一樣,類(lèi)知道它們可響應(yīng)哪些消息。對(duì)于其他對(duì)象來(lái)說(shuō),可用的方法是由對(duì)象的類(lèi)確定的。類(lèi)對(duì)象也屬于一個(gè)“類(lèi)”,稱(chēng)之為元類(lèi)(metaclasS),它確定了類(lèi)對(duì)象可響應(yīng)的消息。

有三個(gè)與元類(lèi)有關(guān)的重要的類(lèi):

(1)Metaclass——所有元類(lèi)的類(lèi);

(2)class——類(lèi)Metaclass的所有實(shí)例的超類(lèi);

(3)每個(gè)元類(lèi)只有一個(gè)實(shí)例:以它為元類(lèi)的類(lèi)。

聲明一個(gè)新類(lèi)要想增設(shè)一個(gè)新類(lèi),首先要選擇它的超類(lèi),并使它成為所選超類(lèi)的子類(lèi),然后加上新的實(shí)例變量和方法。類(lèi)是通過(guò)向新類(lèi)(或要修改的類(lèi)的超類(lèi))發(fā)送消息來(lái)定義的,該消息將以類(lèi)的規(guī)格說(shuō)明信息作為變?cè)?。要聲明的?lèi)的信息如下:

類(lèi)名。

類(lèi)的對(duì)象是否存放指針、字或字節(jié)。

類(lèi)的對(duì)象是否含有索引實(shí)例變量。

類(lèi)的對(duì)象的有名實(shí)例變量名字。

所有類(lèi)的對(duì)象可用的類(lèi)變量名字。

該類(lèi)的對(duì)象和其他類(lèi)的對(duì)象可用的共享變量的共享字典的名字。

消息和方法smalltalk的處理都采用向?qū)ο蟀l(fā)送消息的方式。消息是為了表示用戶(hù)對(duì)對(duì)象的計(jì)算要求所使用的交互式語(yǔ)言。而方法又是對(duì)象響應(yīng)消息而完成的算法。一個(gè)類(lèi)協(xié)議有兩部分——類(lèi)方法和實(shí)例方法。

類(lèi)方法實(shí)現(xiàn)那些發(fā)送到類(lèi)的消息,類(lèi)消息的接受者總是類(lèi)對(duì)象,而不是類(lèi)的實(shí)例。所有的類(lèi)都是全局變量并可用它們的類(lèi)名來(lái)引用。

實(shí)例方法實(shí)現(xiàn)那些發(fā)送到實(shí)例的消息,實(shí)例消息的接受者總是一個(gè)類(lèi)的實(shí)例對(duì)象。

方法包含一系列smalltalk表達(dá)式,其中包括:

1.文字

#aSymbol #(1 2 4 16) ’magic`。

2.變量名

Smalltalk x replacementCollection

3.消息表達(dá)式

bag add:Stream next

100 factorial

array at:index+10 put:Bay new

4.代碼塊

[:x:y I x name