我有一个带有实例变量'a'的类。
当我使用new创建类的新实例时,调用的方法的顺序是什么?
对象如何知道它应该调用initialize方法?
如果我创建一个类方法来为我的实例变量赋值,是否还会为我的类方法未调用的其他实例变量调用初始化?
答案 0 :(得分:7)
initialize
通常由new
方法本身调用。
我认为标准实施是:
new
^self basicNew initialize
#basicNew
是一个只创建对象的原语,但不进行初始化。在basicNew之后,所有实例变量都为零。
请注意,在Smalltalk的所有实现中都不会自动调用initialize方法(但我不知道哪些不执行)所以如果你想要正确移植,你应该覆盖#new
在你的类中明确地调用它。
答案 1 :(得分:1)
如果我创建一个类方法来为我的实例变量赋值,是否还会为我的类方法未调用的其他实例变量调用初始化?
如果您在Pharo中使用Kent Beck的构造函数参数方法习惯用法,其中#initialize
从#new
发送(如Stuart的回答所述):
Point class>>x: xNumber y: yNumber
^self new
setX: xNumber
y: yNumber
Point>>setX: xNumber y: yNumber
x := xNumber.
y := yNumber.
^self
然后首先您的初始化方法将被调用,之后只有 构造函数参数方法将被调用。