GNU Smalltalk Problem with Example in Tutorial Object creation

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I tried to run the example of GNU Smalltalk in the documentation but ran into an issue.

Object subclass: Account [
  | balance |
  new [
    | r |
    r := super new.
    r init.
    ^r
  ]
  init [
     initialize account  printNl.
    balance := 0
  ]
  get [
    ^balance
  ]
]

In the new method the init message is never sent to the Account method. Heres my output:

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

http://www.gnu.org/software/smalltalk/manual/gst.html#Creating-classes http://www.gnu.org/software/smalltalk/manual/gst.html#Creating-classes

Can somebody help me spot the error? I assumed that perhaps the init method of super is called, but Object does not have a init method. Furthermore should super create a instance of the current class?

  Thanks Benjamin for the answer   

So my problem was that i did not distinguish between class functions (new) and Object functions

Fixed Code

Object subclass: Account [
  | balance |
  init [ balance := 0 ]
  get [ ^balance ]
]
Account class extend [
  new [ ^ (super new init) ]
]


st> Account new get
0

Answers

There is a slight change you ve made to the code that means it won t work.

In Smalltalk, methods can be attached in one of two places: they can apply to instances of a class, which in this case would be account objects (like the one you get back from running Account new), or they can be class methods, which means they apply to the actual class itself, Account.

Account init is an instance method. It sets some sane defaults for the instance of the Account class you ve made. You wrote that correctly, and it s behaving as it should.

On the other hand, you ve changed Account new from a class method to an instance method. When it s a class method, it replaces Accounts existing new method with one that calls init. When it s an instance method, it doesn t really do anything, since you re not going to be calling new on the instance.

The fix is easy enough: tell GNU Smalltalk that the new method is a class method. To do that, you just put the method on Account class >> new instead of loose in the Account class.

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/5613363/gnu-smalltalk-problem-with-example-in-tutorial-object-creation

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils