我尝试运行文档中的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文档中取了这个例子。
谁能帮我指出这个错误吗?我假设可能调用了super的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
你对代码做了一个小小的改动,这意味着它不能工作。
在Smalltalk中,方法可以附加在两个地方之一:它们可以应用于类的实例,在本例中是帐户对象(就像运行Account new
获得的对象),或者它们可以是类方法,这意味着它们应用于实际类本身,Account
。
Account init
是实例方法。它为您创建的Account
类的实例设置一些相同的默认值。你写对了,它的行为应该是这样的。
另一方面,您已经将Account new
从类方法更改为实例方法。当它是一个类方法时,它用一个调用init
的方法替换Account
现有的new
方法。当它是一个实例方法时,它实际上不做任何事情,因为您不会在实例上调用new
。
修复很简单:告诉GNU Smalltalk new
方法是一个类方法。要做到这一点,只需将方法放在Account class >> new
上,而不是放在Account
类中。
第一个new
应该是Account class >> new
。谢谢!
另一个可能性是:
Object subclass: Account [
| balance |
Account class [
new [
...
]
otherClassMethod [
...
]
]
instanceMethod [
...
]
]