2

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

有人可以帮我找出错误吗?我假设可能init调用了 super 的方法,但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
4

3 回答 3

3

您对代码做了一些细微的更改,这意味着它不起作用。

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

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

另一方面,您已经Account new从类方法更改为实例方法。当它是类方法时,它将Account现有new方法替换为调用init. 当它是一个实例方法时,它实际上并没有做任何事情,因为您不会调用new实例。

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

于 2011-04-10T22:25:49.687 回答
2

第一个new应该是Account class >> new。谢谢!

于 2011-04-10T19:27:52.907 回答
1

另一种可能性是:

Object subclass: Account [
    | balance |
    Account class [
        new [
          ...
        ]

        otherClassMethod [
          ...
        ]
    ]

    instanceMethod [
      ...
    ]
]
于 2011-04-13T15:03:28.147 回答