GNU Smalltalk:教程中的示例问题(对象创建)
我试图在文档中运行GNU Smalltalk的示例,但遇到了一个问题GNU Smalltalk:教程中的示例问题(对象创建),smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我试图在文档中运行GNU Smalltalk的示例,但遇到了一个问题 Object subclass: Account [ | balance | new [ | r | r := super new. r init. ^r ] init [ 'initialize account' printNl. balance := 0 ] get [ ^balance ] ] 在new方法中,init消息永远不会发送到
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
我从这个例子
有人能帮我找出错误吗?我假设可能调用了super的init
方法,但是Object
没有init
方法。此外,super
是否应该创建当前类的实例
谢谢本杰明的回答
所以我的问题是我没有区分类函数(new
)和对象函数
固定代码
Object subclass: Account [
| balance |
init [ balance := 0 ]
get [ ^balance ]
]
Account class extend [
new [ ^ (super new init) ]
]
st> Account new get
0
第一个
new
应该是Account class>>new
。谢谢 您对代码做了一点小小的更改,这意味着它无法工作
在Smalltalk中,方法可以附加在两个位置之一:它们可以应用于类的实例,在本例中是account对象(如运行account new
返回的对象),也可以是类方法,这意味着它们应用于实际的类本身account
accountinit
是一个实例方法。它为您创建的Account
类的实例设置了一些合理的默认值。你写得对,它的表现也应该如此
另一方面,您已将accountnew
从类方法更改为实例方法。当它是类方法时,它将用调用init
的方法替换Account
s现有的new
方法。当它是一个实例方法时,它实际上什么都不做,因为您不会对实例调用new
修复非常简单:告诉GNU Smalltalk
new
方法是类方法。为此,您只需将该方法置于Account class>>new
而不是Account
类中。另一种可能性是:
Object subclass: Account [
| balance |
Account class [
new [
...
]
otherClassMethod [
...
]
]
instanceMethod [
...
]
]
你能解释一下为什么需要设置这个吗?我很困惑这是否有效:Dbecause
new
是类端的方法,而不是实例上的方法。您将new
发送到Account
类,而不是发送到银行账户。我喜欢这种语法。对于如何定义类方法,是否有一个约定?是否有比Account Class>>new
更短的语法(最好是没有类名的语法)?