Я только начинаю использовать gnu-smalltalk.Я взял следующий код из здесь , чтобы определить класс:
Number subclass: Complex [
| realpart imagpart |
"This is a quick way to define class-side methods."
Complex class >> new [
<category: 'instance creation'>
^self error: 'use real:imaginary:'
]
Complex class >> new: ignore [
<category: 'instance creation'>
^self new
]
Complex class >> real: r imaginary: i [
<category: 'instance creation'>
^(super new) setReal: r setImag: i
]
setReal: r setImag: i [ "What is this method with 2 names?"
<category: 'basic'>
realpart := r.
imagpart := i.
^self
]
]
Однако я не могу создать ни одного экземпляра этого класса.Я пробовал различные методы и следование дает наименьшую ошибку!
cn := Complex new: real:15 imaginary:25
cn printNl
Ошибка:
complexNumber.st:24: expected object
В основном ошибка следующая, например, если после ключевого слова new
нет двоеточия:
$ gst complexNumber.st
Object: Complex error: use real:imaginary:
Error(Exception)>>signal (ExcHandling.st:254)
Error(Exception)>>signal: (ExcHandling.st:264)
Complex class(Object)>>error: (SysExcept.st:1456)
Complex class>>new (complexNumber.st:7)
UndefinedObject>>executeStatements (complexNumber.st:25)
nil
Кроме того, мне не ясно, что это за метод с двумя именами, каждое с одним аргументом:
setReal: r setImag: i [ "How can there be 2 names and arguments for one method/function?"
<category: 'basic'>
realpart := r.
imagpart := i.
^self
]
Я считаю, что обычный метод должен быть с одним именем и аргументом (ами), как в коде здесь:
spend: amount [
<category: 'moving money'>
balance := balance - amount
]