何时在smalltalk中调用初始化?

时间:2013-09-27 01:45:38

标签: smalltalk gnu-smalltalk

我有一个带有实例变量'a'的类。

当我使用new创建类的新实例时,调用的方法的顺序是什么?

对象如何知道它应该调用initialize方法?

如果我创建一个类方法来为我的实例变量赋值,是否还会为我的类方法未调用的其他实例变量调用初始化?

2 个答案:

答案 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

然后首先您的初始化方法将被调用,之后只有 构造函数参数方法将被调用。