В Smalltalk методы не являются самостоятельными вещами.
Метод — это способ ответа объекта на отправленное сообщение.
Если то, что получает сообщение, знает, как ответить на сообщение, у него есть метод ответа на сообщение. Говорят, что имя сообщения содержится в протоколе сообщения объекта.
Итак, у каждого сообщения есть получатель и имя сообщения.
Сообщение с ключевым словом также будет иметь один или несколько аргументов, по одному ключевому слову для каждого аргумента.
Обратной стороной этого является то, что все методы являются частью объекта. Они хранятся в определении класса объекта в виде метода класса или метода экземпляра.
(Единственным исключением является конкретный случай анонимных объектов, называемых блоками. В этих случаях метод определяется в определении блока).
Вот пример сообщения с ключевым словом: Transcript show: 'Hello World!'
Это означает «отправить сообщение show: 'Hello World!'
получателю Transcript
». (Транскрипт — это окно, отображающее вывод системы. Все графические среды Smalltalk имеют класс Transcript).
Это сообщение состоит из трех частей:
Крайняя левая часть всегда является получателем. В этом примере получатель — Transcript
.
Название сообщения show:
содержит одно ключевое слово show:
.
Аргумент 'Hello World'
(Еще более полное объяснение Transcript show: 'Hello World!'
можно найти на странице [http://beginningtosmalltalk.blogspot.com/2015/11/hello-world.html]
Пример сообщения с ключевыми словами с несколькими ключевыми словами:
aByteString copyReplaceAll: i1 with: i2
Получатель aByteString
, экземпляр класса ByteString
Имя сообщения — copyReplaceAll:with:
. Оно состоит из двух ключевых слов: copyReplaceAll:
и with:
.
Аргументы: i1
и i2
.
Если класс ByteString
(или любой класс выше него в иерархии классов, например String
) содержит метод, то сообщение находится в протоколе объекта.
string1 := 'Lemon' .
string1 copyReplaceAll: i1 with: i2
При желании вы можете добавить свой код в String
или ByteString
в качестве дополнительного метода.
subst: i1 by: i2
"Substitute all instances of substring i1 with string i2.
Return the receiver"
^ self copyReplaceAll: i1 with: i2
Затем его можно вызвать в рабочей области следующим образом:
string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3
Но string1 subst: string2 by: string3
не сильно отличается от
string1 copyReplaceAll: string2 with: string3
Еще один момент, на который стоит обратить внимание, заключается в том, что каждое ключевое слово в сообщении с ключевым словом должно быть как можно более описательным и недвусмысленным. subst
может означать substitute
или substring
Самый простой способ добавить метод в класс — использовать системный браузер. Щелкните класс в системном обозревателе, и в области редактирования появится определение метода-проформы.
Перепечатайте его и введите Accept it
(в моей системе щелкните правой кнопкой мыши на 2-х или 3-кнопочной мыши или нажмите сочетание клавиш «Ctrl-s». Хотя сопоставление мыши и клавиш может различаться на разных платформах).
person
Euan M
schedule
15.11.2015