2015-06-21 94 views
3

我需要幫助瞭解Smalltalk中變量的用法和區別。 下面給出的代碼中每個變量有什麼區別和用法?smalltalk中的變量類型

Object subclass: #MyClass 
    instanceVariableNames: 'x' 
    classVariableNames: 'Yy' 
    poolDictionaries: '' 
    category: 'helpMe' 

MyClass class 
    instanceVariableNames: 'zzz' 

回答

10

實例變量(x)是一個實例本地的變量。類或任何其他實例都不能訪問該變量。

類變量(Yy)對類,其所有實例,所有子類和所有子實例(因此是整個層次結構)都是本地的。任何子類或子實例都可以看到該變量的值。

類實例變量(zzz)對類是本地的。只有定義變量的類纔有權訪問它,無論是實例還是子類都無法看到變量(儘管子類繼承變量的聲明,它們的變量將具有不同的值)。 類也是Smalltalk中的對象。因此,您可以像考慮實例變量一樣思考類實例變量:沒有其他實例(類的實例)可以看到該值。感謝@Amos M. Carpenter指出了這一點。

+1

+1,即使我認爲有關_class實例變量_的位不太正確。如果我沒有記錯,只有班級有權訪問它們,但不是它的實例。子類繼承它們,但有它們自己的值。對於來自其他語言的人來說,這個類通常很難理解,因爲類本身並不是真正的對象。 –

+2

是的,你是對的。感謝您指出了這一點。我已經修改了我的答案以包含這一點。 –

3

變量是標識符。一個變量持有對某個對象的引用。

instanceVariableNames:這裏x屬於一個類的實例。

classVariableNames:這裏的Yy有一個與所有類的所有實例共享的變量的副本,它可以是一個靜態的變量。 因此x可以在不同的對象中具有不同的值。但Yy只能有一個值。

poolDictionaries:在Smalltalk的創建提供訪問一組類之間共享變量

類別「helpme」是相關類的集合,如果你沒有一個類別創建類;該類將被創建爲一個空白類別。

子類有它自己的instanceVariableNames(zzz),也有繼承屬性。

0

爲了避免混淆非小寫字母: 輸入的內容是一條消息(Object類),要求它用實例變量創建一個名爲'MyClass'的子類,槽)命名爲'x'和一個名爲'Yy'的類變量。接下來是一個消息給剛剛創建的類,以定義一個名爲'zzz'的類實例變量(這是類對象中的一個槽 - 不是它的實例)。

  • 全局變量
    'Object'和'MyClass'是「全局變量」。它們在任何地方都可見,並且在全球詞典 (包含鍵值對)中在技術上是綁定的。在舊的實現中,只有一個這樣的字典;在最近的實現中,有多個,它們被稱爲「命名空間」。在你的例子中,發送給Object類的類定義消息將爲'MyClass'名稱創建一個新的綁定。

  • 類變量
    'Yy'是一個類變量;這也指綁定,但綁定僅在類及其子類(類方法和實例方法)中可見(請參見下文)。所有引用相同的綁定,因此子類將看到相同的值。它們可以在子類中重新定義,但是再次,重定義子類的所有子類都指向相同的綁定。

  • 實例變量
    這些是對象的專用插槽。 'x'是你的例子中的一個。對象和方法(操作)的佈局由子類繼承,但是當然,每個單獨的實例都有自己的值。實例變量對實例方法可見(當然)。

  • 類實例變量
    因爲類是它們自己的對象(元類的實例),所以它們也可以有專用的插槽。從技術上講,它們只是類對象的實例變量,對類方法可見。與實例變量一樣,佈局和方法由子類繼承,但每個(類)都有自己的值。這經常被C++/Java人誤解,因爲他們的語言沒有相應的結構(同樣請注意,類方法是繼承的,可以在Smalltalk中重新定義,而其他語言的靜態函數不能)

  • 池變量(共享池)
    類似於類變量,因爲它們指的是由類對象非全局持有的綁定。然而,這些在一些合作課程中是可見的(類似於另一種語言中的「朋友」)。通過在類定義消息中命名一個池,它的綁定對類和實例方法變得可見。通常,這些用於定義共享常量。

其它變量類型(不存在於您的代碼示例)是方法-當地人和塊本地人。這些是指當前上下文中的槽,這在技術上是方法或塊的棧幀(繼續)(或者在塊實際上是閉包的情況下是外部上下文)。

'category'只是該類的一個屬性,不要與上述變量混淆。把它看作是附加在它上面的標籤,以便在瀏覽器中提供更好的組織。該屬性存儲位置的詳細信息是特定於方言的:大多數使用單獨的(所謂的「組織」),這是一個字典。但是,至少有一種方言(ST/X)將它作爲類對象的專用槽(並且在某種意義上它確實是一個變量)。