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消息永远不会发送给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 [
      ...
    ]
]

相关内容

最新更新