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消息永远不会发送到

我试图在文档中运行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
我从这个例子

有人能帮我找出错误吗?我假设可能调用了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
更短的语法(最好是没有类名的语法)?