2010-06-23 75 views
10

什麼是Java的靜態字段和方法的Smalltalk等價物? IOW,Smalltalkers在需要課堂級數據和/或方法時會做什麼?什麼是Java靜態的Smalltalk等價物?

+0

不值得一個「正式」的答案,但我偶然發現這個網頁可能會幫助你:http://per.bothner.com/papers/smalltalk.html。 – 2010-06-23 14:03:37

+0

我建議把你的第二個問題分解爲一個_separate_問題。 – 2010-06-23 14:32:14

+0

@Frank:很好。正如你所說。 – Jim 2010-06-23 14:36:20

回答

10

我們使用類方法/實例變量。畢竟,一個類是一個對象,所以可以有方法。

例如,矩形類有一個方法#origin:角落:所以你可能會寫

Rectangle origin: [email protected] corner: [email protected] 

創建一個矩形。這只是#origin:corner:發送到名爲Rectangle的對象(一個類是一個對象!),兩個Points作爲參數。

類端實例變量的工作方式大致相同。作爲對象的類可能有實例變量。從蘇尼特庫:

TestCase class 
    instanceVariableNames: 'history' 

然後TestCase類暴露按通常的方式,用一個getter/setter方法(#history和#history :)。

編輯:我用的@引起了一些討論。這就是所謂的binary message,它允許一個定義選擇器,看看其他語言將稱爲中綴操作符。例如,3 + 4或​​。在@的情況下,Number類定義了一個名爲@的方法,其參數爲y,定義爲^Point x: self y: y - 「返回x座標爲我自己的值並且其y座標爲參數的點」。

點是有序對,但當然沒有什麼能阻止定義更高維的版本。 Point可能會定義一個名爲@的方法,如下所示:^Triple x: self x y: self y z: z - 「返回R^3中的一個點,其中x,y座標是我自己的,並且其z座標是給定的參數」。

+0

除Smalltalk以外的其他語言是否使用@來分隔點的不同座標?我不相信我以前見過這種特定的語法。 – JAB 2010-06-23 14:30:23

+0

這個'@'表示一個元組嗎? – Jim 2010-06-23 14:33:07

+0

@是一個「二進制消息」 - 一個消息,只接受一個參數,但不需要通常的結果:。 Number定義了一個名爲@的方法,該方法返回一個Point:^ Point x:self y:y(其中y顯然是唯一的參數)。 – 2010-06-23 14:36:16

1

在大多數類型的Smalltalk中,您都有類變量。通常,類變量用於例如singletons。儘管你可以在Smalltalk之間使用不同類型的變量,但請閱讀關於此特定實現的文檔。

4

如果您是來自Java或Smalltalk的Smalltalk,那麼最重要的思想轉變就是類是對象。

類似Java的語言中的靜態可以有許多不同的語義。通常這與可見度有關。您需要一個獨立於類的任何實例的對象,但您希望將此對象的可見性限制在類內,即:僅在類的實例或類本身中可見(在Smalltalk中,因爲在Java中類不是一流的對象)。

在Smalltalk中你通常有這個更多的選擇:

  • 類變量或游泳池的變量(取決於你的Smalltalk方言)

    1. 類的實例變量

    一個類的實例變量確實就像任何類的實例的實例變量一樣:類具有此屬性,並且可以通過在類上提供getter方法(不在實例上,我們稱之爲類方法)來使該類的任何實例都可以訪問該屬性, 。如果您有默認值等,這很有用。例如:

    定義一個類Car,與實例變量colour,PLUS一個類的實例變量defaultColour(這當然將具有值「BLACK」 ;-))

    Smalltalk defineClass: #Car 
        superclass: #{Core.Object} 
        indexedType: #none 
        private: false 
        instanceVariableNames: 'colour ' 
        classInstanceVariableNames: 'defaultColour' 
        imports: '' 
        category: '' 
    

    這是一類定義(實際上是VisualWorks Smalltalk中的對象Smalltalk的消息)。 如果您創建Car的子類,它將繼承類實例變量defaultColour,因爲普通對象也可以。如果defaultColour類的實例變量有一個值,那麼子類也會繼承這個值!

  • 相關問題