2013-09-27 40 views
3

我有一個實例變量'a'的類。什麼時候在smalltalk中調用初始化?

當我使用new創建類的新實例時,調用方法的順序是什麼?

對象如何知道它應該調用初始化方法?

如果我創建一個類值方法爲我的實例變量賦值,初始化是否還會被其他實例變量調用,而這些變量不會被我的類方法調用?

回答

7

initialize通常由new方法本身調用。

我相信標準的執行是:

new 
    ^self basicNew initialize 

#basicNew是一種原始的,只是創建對象,但不執行初始化。在basicNew之後,所有的實例變量都是零。

請注意,在所有Smalltalk實現中都不會自動調用initialize方法(但我不知道哪些不會執行此操作),所以如果您想正確移植,則應該在您的類中覆蓋#new明確地調用它。

1

斯圖爾特回答完美。但是,如果你還在懷疑你的第二個問題:

如果我創建一個類的方法來賦值給我的實例變量,將初始化仍然可以呼籲其他實例變量不是由我的類中的方法調用的?

如果你使用像Kent Beck的構造函數參數法成語例如在菲羅,其中#initialize#new發送(如司徒雷登的答案描述):

Point class>>x: xNumber y: yNumber 
    ^self new 
     setX: xNumber 
     y: yNumber 

Point>>setX: xNumber y: yNumber 
    x := xNumber. 
    y := yNumber. 
    ^self 

然後第一您初始化方法將被調用,之後只有你的構造函數參數方法將被調用。

+1

請注意,類(它是一個對象A)不能直接寫入一個實例(這是另一個對象B)。 A的唯一方法是向B發送消息。在所有情況下,A必須先創建B,然後正確初始化。我的構造函數是自動執行兩個操作(創建+初始化)的東西。當新的發送初始化時,單元化的newNew被隱藏,所以我們可以保持正確的構造函數的錯覺。爲了避免對x:y等其他消息進行兩次初始化:我們寧願發送Point basicNew setX:y :,儘管對於Point而言,Integer >> @通常是一個原語,因此是原子的。 –

+0

是的,並且可能是Smalltalk Kent Beck在編寫* Smalltalk最佳實踐模式時使用的*默認情況下未通過'#new'調用'#initialize'。 – MartinW

相關問題