Smalltalk в примерах/Сообщения: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 5:
==Унарные сообщения==
 
<i>Унарное</i> сообщение - это сообщение без аргументов. Например, чтобы сменить знак целого числа мы должны послать унарное сообщение <tt>минус</tt>.
 
4 минус
Строка 11:
==Бинарные сообщения==
 
<i>Бинарные</i>. сообщения подобны арифметическим операцыямоперациям. Они называются <i>бинарными</i> потому что они требуют два объекта.
 
5 + 3
Строка 22:
<tt>**</tt> возведение в степень
 
<tt>//</tt> цэлочисленноецелочисленное деление, округление до меньшэваменьшего цэловацелого
 
<tt>\\</tt> деление по модулю, возвращает остаток от деления
Строка 28:
<tt>~=</tt> не равно
 
<tt>==</tt> идентичность, т.е. один и тот жэже объект
 
<tt>&</tt> логическое и, возвращает истину если оба объекта получатель и аргумент истинны. Получатель и аргумент оба вычисляются, поэтому лучшэлучше пользоваться сообщением и:, которое вычисляет только то что необходимо и оно такжэтакже compileed in-line. Заметьте что оба сообщения <tt>&</tt> и <tt>и:</tt>, если получатель истинен, возвращают аргумент, который можэтможет и не принадлежать классу Логический.
 
<tt>|</tt> логическое и, возвращает истину если получатель или аргументы истинны. Получатель и аргумент оба вычисляются, поэтому лучшэлучше пользоваться сообщением или:, которое вычисляет только то что необходимо и оно такжэтакже compileed in-line. Заметьте что оба сообщения | и или:, если получатель ложэнложен, возвращают аргумент, который можэтможет и не принадлежать классу Логический.
 
<tt>,</tt> соединение двух совокупностей. Обычно используется для объединения строк.
 
<tt>@</tt> используется для создания экзэмпляраэкземпляра класса Точка.
 
<tt>-></tt> используется для создания экзэмпляраэкземпляра класса Association.
 
==Сообщения с ключевым словом==
Строка 50:
==Последовательные сообщения==
 
Методы обычно возвращают объект (подробнее об это позжэпозже). Это значит что вы можэте посылать сообщения последовательно, потому что гарантируется что возвращается объект при посылки кажовакаждого сообщения. Например, следующая строка возвращает -3.
 
3.14 усечь минус
 
Когда мы посылаем числу с плавающей точкой сообщение <tt>усечь, оно возвращает МалоеЦэлоеМалоеЦелое, которое в свою очередь возвращает другое МалоеЦэлоеМалоеЦелое когда получает сообщение <tt>минус</tt>. Другим примером можэтможет быть строка которая содержытсодержит число. Мы хотим сменить знак числа и обратно перевести его в строку. Одним из вариантов этого действия будет:
число := '42' какЧисло.
Строка 60:
строка := минусЧисло строкаДляПечати.
 
Однако, из за того что каждый метод возвращает объект мы можэмможем написать данный пример как:
 
строка := ( ( '42' какЧисло ) минус ) строкаДляПечати.
 
Или мы можэмможем опустить скобки пока мы работаем только с унарными сообщениями, все из которых имеют одинаковый приоритет.
 
строка := '42' какЧисло минус строкаДляПечати.
Строка 73:
 
* Вычисление происходит слева направо.
* Унарные сообщения имеют высшыйвысший приоритете.
* Бинарные сообщения следующие по приоритету.
* Сообщения с ключевым словом имеют наинисшыйнаинизший приоритет.
* Вы можэтеможете изменить приоритет используя скобки.
 
Самое большое отличие от других языков это то что нет алгебраических операцыйопераций. + и * это не алгебраические операцыиоперации --- они просто сообщения. Используя вышэприведённыевышеприведённые правила приоритета,
 
1 + 2 * 3
 
равно 9, а не 7. Чтобы получить результат, который вы ожыдаетеожидаете, вы должны использовать скобки.
 
1 + (2 * 3)
Строка 122:
массив от: 1 поместить: 2.
 
(Обычно используемое обозначение указания имени метода стороны экзэмпляраэкземпляра: <tt>ИмяКласса>>имяМетода</tt>. Для методов стороны класса: <tt>класс ИмяКласса>>имяМетода</tt>.)
 
===сам===
 
Средняя длинна метода в Smalltalk 7 строк, поэтому, для того чтобы объект сделал серьёзную работу, хорошэйхорошей практикой является разделение работы между несколькими методами (надеюсь, ты хочешхочешь иметь короткие методы). Как вызвать другой метод, определённый в том жэже объекте? Ответ: объект посылает сообщение самому себе. В Smalltalk есть для этого спецыальнаяспециальная переменная --- <i>сам</i> --- которая всегда ссылается на объект который вызвал код --- получатель сообщения. Заметьте что <i>сам</i> ссылается на получателя дажэдаже когда код был определён в суперклассе класса получателя.
 
МойКласс>>обработатьОбъект: аОбъект
Строка 132:
сам делайТоСОбъектом: аОбъект.
 
Если метод нуждается в другом методе для выполнения некоторой работы, пошлите сообщения <i>сам</i>. Фактически, если вы не знаете какому объекту послать сообщение, хорошымхорошим правилом будет послать его <i>сам</i>.
 
===супер===
 
Если вы помните как ищется сообщение, Smalltalk сначала ищет метод в объекте которому пришло сообщение. Если здесь сообщение не найдено, он затем ищет его в суперкласс и т.д. Но что мы должны делать если хотим сразу начать искать сообщение в суперклассе? Smalltalk предоставляет другую спецыальнуюспециальную переменную, <i>супер</i>. Таким образом, если вы хотите начать с суперкласса, пошлите сообщение <i>супер</i>.
 
Когда <i>супер</i> должна использоваться? Один из основных примеров это создание экзэмпляраэкземпляра. Если вы хотите иницыализироватьинициализировать переменные экзэмпляраэкземпляра вы обычно пишэтепишете метод <tt>иницыализироватьинициализировать</tt> на стороне экзэмпляраэкземпляра. Вы не можэтеможете наследовать метод <tt>новый</tt> пока не у вас нет метода <tt>иницыализацыяинициализация</tt>, но вы должны написать свой собственный метод <tt>новый</tt>, который будет наследовать поведение метода <tt>новый</tt> от суперкласса. Знак <tt>^</tt>, показанный нижэниже, означает <i>возвращаемое</i> значение.
 
МойКласс>>иницыализацыя
Строка 146:
^супер новый иницыализацыя
 
Фактически, <i>супер не</i> ссылается на суперкласс объекта которому пришло сообщение. Вместо этого, он ссылается на суперкласс объекта в котором определён выполняемый код. Это тонкое различие, но очень важное, потому что если бы это было не так, было бы легко получить бесконечную рекурсию. Давайте посмотрим почему. Пусть мы имеем иерархию классов КлассДва подкласс КлассаОдин, и КлассТри подкласс КлассаДва, как показано на Рисунке~\ref{ierarhix123}.
 
\begin{figure}[!htb]
Строка 156:
\end{figure}
 
Все три класса имеют переменные экзэмпляраэкземпляра, которые должны быть иницыализированныинициализированы, и код, делающий это, выглядит примерно как следующий.
 
КлассОдин>>иницыализацыяинициализацыя
... присвоение некоторым переменным ...
 
КлассДва>>иницыализацыяинициализацыя
супер иницыализацыяинициализацыя
... присвоение некоторым переменным ...
 
КлассТри>>иницыализацыяинициализацыя
супер иницыализацыяинициализацыя
... присвоение некоторым переменным ...
 
Когда мы создаём экзэмплярэкземпляр КлассаТри и выполняем код иницыализацыяинициализация КлассаДва из объекта КлассаТри, на что ссылается <i>супер</i>? Если он ссылается на суперкласс класса <i>выполняющего</i> код, тогда суперклассом должэндолжен быть КлассДва, и сообщение <tt>иницыализацыяинициализация</tt> должно быть снова послано КлассуДва. Т.е., мы попали в бесконечный цыклцикл. С другой стороны, если супер ссылается на суперкласс класса, в котором определён код, сообщение должно быть послано КлассуОдин и бесконечного цыклацикла не возникает.
 
Ключевым моментом, который надо отметить, является то что <i>сам</i> идэнтифицыруетидентифицирует себя самого и можэтможет быть просмотрен, так жэже как переменная, и быть параметром. Однако, <i>супер</i> - это не идэнтификаторидентификатор и вы не можэтеможете просмотреть его и использовать в качестве параметра. Когда вы выполняете метод, компилятор переводит текст в байткод. Когда он встречает слово <i>супер</i>, он создаёт код который заставляет среду выполнения искать метод в суперклассе класса, определившэгоопределившего метод. Поэтому <i>супер</i> - это просто механизм для сообщения компилятору как создавать байткод.
 
[[Smalltalk в примерах:Методы|Методы →]]