我认为您很接近,但是您尝试了一个不起作用的快捷方式,因为您期望在类定义中(在方法和本地有效性之外)将值设置为实例变量将返回值。实际上,您希望在方法中使用实例变量,例如init
表达对象的内部状态。
正如我在之前的一些答案中所指出的,我不是 GNU Smalltalk 专家。我正在使用 Smalltalk/X-jv 分支进行编程。
我冒昧地将您的代码重写为更多类似 GNU Smalltalk 的代码:
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
MyClass class >> new [
<category: 'instance creation'>
| myClass |
myClass := super new.
myClass init.
^ myClass
]
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]
说明:
我正在定义mainVal
实例变量。然后我重新定义了一个不需要的类方法,new
但出于说明目的,我这样做了。(消息是从类继承的)new
Object
我在类方法中正在做什么new
。我将new
消息发送到superclass
创建实例的anObject
,然后初始化myClass
withinit
然后返回它。
之后,您可以看到将init
您的实例变量初始化为您希望的值的类555
。
然后你有一个getter(在Smalltalk中通常没有get前缀,但那是“唯一”的风格问题)mainVal
。
然后你的代码调用对象并获取值。
gc := MyClass new.
gc mainVal
没有消息重新定义的最小示例:new
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]
您不能忘记,在 Smalltalk 中通常没有默认调用构造函数,因此您必须init
手动发送消息(另一个选项是new
像我上面所做的那样重新定义消息)。
然后使用它看起来像这样:
gc := MyClass new.
a MyClass
st> gc init
a MyClass
st> gc mainVal
555