在smalltalk中何时调用initialize?

在smalltalk中何时调用initialize?,smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我有一个实例变量为“a”的类 当我使用new创建类的新实例时,调用方法的顺序是什么 对象如何知道它应该调用initialize方法 如果我创建一个类方法来为我的实例变量赋值,那么对于我的类方法未调用的其他实例变量,是否仍会调用initialize?initialize通常由新的方法本身调用 我认为标准实施是: new ^self basicNew initialize #basicNew是一个原语,它只创建对象,不进行初始化。basicNew之后,所有实例变量都将为零 请注意,并非在S

我有一个实例变量为“a”的类

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

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


如果我创建一个类方法来为我的实例变量赋值,那么对于我的类方法未调用的其他实例变量,是否仍会调用initialize?

initialize
通常由
新的
方法本身调用

我认为标准实施是:

new
    ^self basicNew initialize
#basicNew
是一个原语,它只创建对象,不进行初始化。basicNew之后,所有实例变量都将为零


请注意,并非在Smalltalk的所有实现中都会自动调用initialize方法(但我不知道哪些实现不会自动调用),因此,如果您希望能够正确地进行移植,您应该在类中重写
#new
,以显式地调用它。

Stuart完美地回答了这一问题。但如果您对第二个问题仍有疑问:

如果我创建一个类方法来为我的实例变量赋值,那么对于我的类方法未调用的其他实例变量,是否仍会调用initialize

如果您在Pharo中使用类似Kent Beck的构造函数参数方法习惯用法,其中,
#initialize
#new
发送(如Stuart的回答所述):


然后首先调用初始化方法,然后才调用构造函数参数方法。

注意,类(对象A)不能直接写入实例(另一个对象B)。A的唯一方法是向B发送消息。在所有情况下,A必须首先创建B,然后正确初始化。对我来说,构造函数是以原子方式执行两个操作(创建+初始化)的东西。当new发送初始化时,单元化的basicNew被隐藏,因此我们可以保持正确构造函数的假象。为了避免对x:y:等其他消息进行两次初始化,我们宁愿发送Point basicNew setX:y:,但对于Point,Integer>>@通常是一个原语,因此是原子的。是的,而且可能是Smalltalk Kent Beck在编写Smalltalk最佳实践模式时使用的默认情况下没有通过
\new
调用
\initialize
Point class>>x: xNumber y: yNumber
    ^self new
        setX: xNumber
        y: yNumber

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