Pharo中Point类new与initialize方法差异及代码疑问解析
Pharo中new与initialize方法差异解析:三段代码问题解答
问题1:a := Point initialize. 未初始化x和y的原因
initialize是实例方法,默认负责初始化实例的状态(比如实例变量x、y)。但直接调用Point initialize时,执行的是Point类的类级initialize方法(若类定义了该方法)——而Point的类级initialize逻辑并不处理实例变量x、y,实例变量的初始化仅存在于实例端的initialize方法中。- 只有通过
Point new创建实例时,系统才会自动调用该实例的initialize方法,完成x、y的初始化。直接调用类的initialize和实例变量毫无关联,因此x、y不会被设为nil。
问题2:a := Point. a x: 5 y:6. 无需new的原因
x:y:是Point的类方法,它的内部实现已经包含了实例创建与初始化的逻辑。比如Point类的x:y:方法大致如下:x: xCoord y: yCoord ^ self new setX: xCoord setY: yCoord- 调用
Point x:5 y:6时,方法内部会自动调用new创建实例,完成坐标赋值后返回该实例。这里a := Point只是把类对象赋值给a,但后续调用a x:5 y:6本质是调用类方法,最终返回的是实例,因此能得到5@6。
问题3:a := Point new. a x:5 y:6. 报错的原因
x:y:是Point的类方法,实例对象并没有这个方法。Point实例上用于设置坐标的是实例方法setX:setY:,或者单独的x:和y:方法。- 正确写法示例:
或者:a := Point new. a x:5; y:6.a := Point new setX:5 setY:6. - 直接调用实例的
x:y:会触发“找不到该选择器的方法”错误,因为实例不响应这个消息。
内容的提问来源于stack exchange,提问作者magnolia93
相关产品推荐
相关产品推荐

