我试图在文档中运行GNU Smalltalk的示例,但遇到了一个问题。
Object subclass: Account [
| balance |
new [
| r |
r := super new.
r init.
^r
]
init [
'initialize account' printNl.
balance := 0
]
get [
^balance
]
]
在new
方法中,init
消息永远不会发送到Account
方法。
继承我的输出:
st> Account new get
nil
st> Account new init get
'initialize account'
0
我从GNU Smalltalk Documentation获取此示例。
有人可以帮我发现错误吗?我假设可能调用了超级init
方法,但Object
没有init
方法。此外,super
应该创建当前类的实例吗?
感谢Benjamin的回答
所以我的问题是我没有区分类函数(new
)和对象函数
固定代码
Object subclass: Account [
| balance |
init [ balance := 0 ]
get [ ^balance ]
]
Account class extend [
new [ ^ (super new init) ]
]
st> Account new get
0
答案 0 :(得分:3)
您对代码进行了轻微更改,这意味着它无法正常工作。
在Smalltalk中,方法可以附加在以下两个位置之一:它们可以应用于类的实例,在这种情况下,它们将是帐户对象(就像您从运行中获取的那个) {1}}),或者它们可以是类方法,这意味着它们适用于实际的类本身Account new
。
Account
是一种实例方法。它为您所创建的Account init
类的实例设置了一些理智的默认值。你写得正确,它的行为应该如此。
另一方面,您已将Account
从类方法更改为实例方法。如果是类方法,它会将Account new
现有的Account
方法替换为调用new
的方法。当它是一个实例方法时,它实际上并没有做任何事情,因为你不会在实例上调用init
。
修复很容易:告诉GNU Smalltalk new
方法是类方法。为此,您只需将方法放在new
上,而不是放在Account class >> new
类中。
答案 1 :(得分:2)
第一个new
应为Account class >> new
。谢谢!
答案 2 :(得分:1)
另一种可能性是:
Object subclass: Account [
| balance |
Account class [
new [
...
]
otherClassMethod [
...
]
]
instanceMethod [
...
]
]