GNU Smalltalk:教程中的示例问题(对象创建)

时间:2011-04-10 17:07:39

标签: 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消息永远不会发送到Account方法。 继承我的输出:

st> Account new get
nil
st> Account new init get
'initialize account'
0

我从GNU Smalltalk Documentation获取此示例。

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

3 个答案:

答案 0 :(得分:3)

您对代码进行了轻微更改,这意味着它无法正常工作。

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

Account是一种实例方法。它为您所创建的Account init类的实例设置了一些理智的默认值。你写得正确,它的行为应该如此。

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

修复很容易:告诉GNU Smalltalk new方法是类方法。为此,您只需将方法放在new上,而不是放在Account class >> new类中。

答案 1 :(得分:2)

第一个new应为Account class >> new。谢谢!

答案 2 :(得分:1)

另一种可能性是:

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

        otherClassMethod [
          ...
        ]
    ]

    instanceMethod [
      ...
    ]
]