gpt4 book ai didi

smalltalk - GNU Smalltalk : Problem with Example in Tutorial (Object creation)

转载 作者:行者123 更新时间:2023-12-02 08:54:58 25 4
gpt4 key购买 nike

我尝试运行文档中的 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 中获取了这个示例.

有人可以帮我找出错误吗?我假设可能调用了 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

最佳答案

您对代码做了一些细微的更改,这意味着它无法工作。

在 Smalltalk 中,方法可以附加在两个位置之一:它们可以应用于类的实例,在这种情况下将是帐户对象(就像您从运行 Account new),或者它们可以是方法,这意味着它们适用于实际的类本身,Account

Account init 是一个实例方法。它为您创建的 Account 类的实例设置一些合理的默认值。您写得正确,并且它的行为应该如此。

另一方面,您已将 Account new 从类方法更改为实例方法。当它是类方法时,它将用调用 init 的方法替换 Account 现有的 new 方法。当它是实例方法时,它实际上不会执行任何操作,因为您不会在实例上调用 new

修复方法很简单:告诉 GNU Smalltalk new 方法是一个类方法。为此,您只需将该方法放在 Account class >> new 上,而不是松散地放在 Account 类中。

关于smalltalk - GNU Smalltalk : Problem with Example in Tutorial (Object creation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com