我有一個實例變量'a'的類。什麼時候在smalltalk中調用初始化?
當我使用new創建類的新實例時,調用方法的順序是什麼?
對象如何知道它應該調用初始化方法?
如果我創建一個類值方法爲我的實例變量賦值,初始化是否還會被其他實例變量調用,而這些變量不會被我的類方法調用?
我有一個實例變量'a'的類。什麼時候在smalltalk中調用初始化?
當我使用new創建類的新實例時,調用方法的順序是什麼?
對象如何知道它應該調用初始化方法?
如果我創建一個類值方法爲我的實例變量賦值,初始化是否還會被其他實例變量調用,而這些變量不會被我的類方法調用?
initialize
通常由new
方法本身調用。
我相信標準的執行是:
new
^self basicNew initialize
#basicNew
是一種原始的,只是創建對象,但不執行初始化。在basicNew之後,所有的實例變量都是零。
請注意,在所有Smalltalk實現中都不會自動調用initialize方法(但我不知道哪些不會執行此操作),所以如果您想正確移植,則應該在您的類中覆蓋#new
明確地調用它。
斯圖爾特回答完美。但是,如果你還在懷疑你的第二個問題:
如果我創建一個類的方法來賦值給我的實例變量,將初始化仍然可以呼籲其他實例變量不是由我的類中的方法調用的?
如果你使用像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
然後第一您初始化方法將被調用,之後只有你的構造函數參數方法將被調用。
請注意,類(它是一個對象A)不能直接寫入一個實例(這是另一個對象B)。 A的唯一方法是向B發送消息。在所有情況下,A必須先創建B,然後正確初始化。我的構造函數是自動執行兩個操作(創建+初始化)的東西。當新的發送初始化時,單元化的newNew被隱藏,所以我們可以保持正確的構造函數的錯覺。爲了避免對x:y等其他消息進行兩次初始化:我們寧願發送Point basicNew setX:y :,儘管對於Point而言,Integer >> @通常是一個原語,因此是原子的。 –
是的,並且可能是Smalltalk Kent Beck在編寫* Smalltalk最佳實踐模式時使用的*默認情況下未通過'#new'調用'#initialize'。 – MartinW