我有一个带有实例变量'a'的类。
当我使用 new 创建类的新实例时,调用的方法的顺序是什么?
对象如何知道它应该调用初始化方法?
如果我创建一个类方法来为我的实例变量赋值,是否仍会为我的类方法未调用的其他实例变量调用初始化?
我有一个带有实例变量'a'的类。
当我使用 new 创建类的新实例时,调用的方法的顺序是什么?
对象如何知道它应该调用初始化方法?
如果我创建一个类方法来为我的实例变量赋值,是否仍会为我的类方法未调用的其他实例变量调用初始化?
initialize
通常由new
方法本身调用。
我相信标准的实现是:
new
^self basicNew initialize
#basicNew
是一个只创建对象但不进行初始化的原语。在 basicNew 之后,所有实例变量都将为零。
请注意,在 Smalltalk 的所有实现中都不会自动调用 initialize 方法(但我不知道哪些不这样做),因此如果您想要适当地移植,您应该#new
在您的类中重写以显式调用它。
Stuart answered it perfectly. But if you have still doubt about your second question:
If I create a class method to assign values to my instance variables, will the initialize still be called for other instance variables that are not invoked by my class method?
If you use something like Kent Beck's Constructor Parameter Method idiom for example in Pharo, where #initialize
is sent from #new
(as described by Stuart's answer):
Point class>>x: xNumber y: yNumber
^self new
setX: xNumber
y: yNumber
Point>>setX: xNumber y: yNumber
x := xNumber.
y := yNumber.
^self
Then first your initialize method will be called and only afterwards your Constructor Parameter Method will be called.