ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6833
Скачиваний: 51
376
Правило 2.
В рамках одного типа все сообщения имеют одинаковый приоритет. Сложное
выражение выполняется слева направо.
Правило 3.
Скобки меняют порядок вычисления.
Таблица 3.8.
Некоторые примеры сообщений и их результатов
Сообщение
Описание
(Класс)
1+2
Бинарное сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
1 (МалоеЦелое)
+
2 (МалоеЦелое)
3 (МалоеЦелое)
" привет' вПозиции: 5
Ключевое сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
' привет' (Строка)
в Позиции:
5(МалоеЦелое)
е (Символ)
5факториал
Унарное сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
5(МалоеЦелое)
факториал
------------------------
120(БольшоеПоложительное Целое)
5между: 3 и:7
Ключевое сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
5(МалоеЦелое)
между: и:
3, 7 (МалоеЦелое)
истина
1+2
Бинарное сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
1 (МалоеЦелое)
+
2 (МалоеЦелое)
3 (МалоеЦелое)
' привет' вПозиции: 5
Ключевое сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат:
'привет' (Строка)
в Позиции:
5(МалоеЦелое)
е (Символ)
5факториал
Унарное сообщение
объект-адресат:
имя сообщения:
объект-параметр;
результат.
5(МалоеЦелое)
факториал
-------------------------
120(БольшоеПоложнтельноеЦелое)
5между: 3 и:7
Ключевое сообщение
объект-адресат:
имя сообщения:
объект-параметр:
результат;
5(МалоеЦелое)
между: и:
3, 7 (МалоеЦелое)
истина
Классы объектов и методы.
Объект обладает свойствами, поведением и состоянием. Ему
можно присвоить имя. Объекты с одинаковыми свойствами и поведением объединены в классы.
Каждый объект входит в один класс и называется
экземпляром класса.
Объекты из одного класса распознают одни и те же сообщения и имеют одинаковую струк-
туру собственной памяти. Объект имеет собственную память -
переменные экземпляра
, где хра-
нится информация о его свойствах и состоянии. Доступ к указанной информации имеет только сам
объект.
С каждым объектом связан набор (протокол) сообщений, которые он понимает. Всякому
сообщению из протокола соответствует реализующая его процедура, называемая методом.
377
Метод определяет реакцию объекта на данное сообщение, т.е. его поведение. Он состоит из
операций над своими переменными экземпляра и из посылок сообщений другим объектам. В ко-
нечном счете объект возвращает ответ на посланное ему сообщение. Поскольку все объекты одно-
го класса обладают одинаковым набором методов, последние хранятся в одном месте - в самом
классе.
У каждого класса существует два типа методов:
• методы класса (используются, когда необходимо произвести
какие-либо действия с целым
классом, например, добавить к классу новый экземпляр);
• методы экземпляра (сообщения к экземплярам данного класса).
Один из основных классов языка Smalltalk - класс «Величина». Экземплярами этого класса
являются объекты, которые можно измерять, сравнивать, упорядочивать и вычислять. К этому
классу , в частности, относятся символы, числа, дата и время. Эта группа классов имеет следую-
щую иерархию.
Символ.
Экземпляры класса «Символ» являются расширенным множеством символов во
внутреннем коде со значениями от 0 до 255.
Дата.
Экземпляры класса «Дата» представляют собой даты, такие как
ЯНВАРЬ 1, 1980.
Время.
Экземпляры
класса «Время» представляют собой время, такое как 10 или
12:15.
Число.
Система поддерживает три вида числа:
• целое;
• вещественное с плавающей точкой (если есть сопроцессор);
• дробь - рациональные целое.
Символ обозначается с помощью знака $, например,
$a,$9,$M.
В языке Smalltalk имеется 6 типов переменных:
•
экземплярные переменные,
существуют в течение всего жизненного цикла объекта экзем-
пляра класса, в заголовке которого они описаны;
•
временные переменные,
описываются внутри метода и существуют только во время вы-
полнения данного метода;
•
переменные класса,
декларируются в описании класса, доступны всем экземплярам данно-
го класса;
•
глобальные переменные,
доступны всем экземплярам всех классов;
•переменные пула,
декларируются в описании класса и доступны
экземплярам
некоторого
подмножества классов;
•
псевдопеременные,
специально зарезервированные идентификаторы, указывающие на
специальные объекты.
Для присвоения значения какой-либо переменной
(исключая псевдопеременные)
использу-
ется операция : : = (присваивание).
Экземпляры объектов можно сравнивать друг с другом.
Класс «Объект» содержит методы сравнения:
=,
~=.
Все классы, являющиеся подклассами
этого класса, наследуют эти методы.
Помимо этого, каждый класс может определить для себя дру-
гие методы сравнения. Например, классы из группы «Величина» имеют еще несколько методов: >
<
<=
>=. Аналогичные методы определены для класса «Строка».
Результат сравнения объектов - экземпляр класса «Логический». Этот класс имеет два под-
класса: Истина и Ложь. Экземплярами этих классов являются псевдопеременные истина и ложь
соответственно. Задание новых экземпляров этих классов приводит к ошибке.
Классы «Истина» и «Ложь» имеют следующий набор методов:
и: - истина, если адресат и параметр - «истина», в противном случае -«ложь» (существует анало-
гичное бинарное сообщение - &)
или: - ложь, если адресат и параметр - «ложь», в противном случае -«истина» (существует анало-
гичное бинарное сообщение -|).
На основе этих методов реализованы условные конструкции. В общем виде условная кон-
струкция имеет вид:
378
<условие>
если условие истинно, выполнить <выражение1> если условие ложно,
выполнить <выражение2>.
На языке ООП эта конструкция записывается таким образом:
<объект-адресат класса Истина или Ложь>
если Истина:<объект-параметр1>
если Ложь: <объект-параметр2>.
В данном случае <объект-параметр> представляет собой
блок сообщений.
Возможна конструкция
<условие> еслиИстина: <объект-параметр>,
а также
<условие> еслиЛожь: <объект-параметр>.
Блок сообщений -
это группа сообщений, заключенная в квадратные скобки. Блоки - это
объекты специального вида, вычисление которых (т.е. выполнение списка внутренних операторов)
производится путем посылки
к ним сообщения-значения.
Блок может иметь аргументы. В этом случае сообщение для его вычисления будет ключе-
вым:
[блок] значение: <значение аргумента>
Программирование на SmalTalk
. Язык Smalltalk обладает богатым набором циклических
конструкций, отраженных в табл. 3.9.
Программирование на SmallTalk состоит не только в использовании предопределенных в
языке объектов и их методов, но и в задании новых методов и объектов.
Вначале рассмотрим создание новых методов для уже существующих классов. Перед соз-
данием нового метода необходимо ответить на следующие вопросы:
1) что будет объектом-адресатом для создаваемого метода;
2) каким будет объект-параметр;
3) что будет результатом, возвращаемым новым методом. Таким образом определяется со-
общение, обращающееся к новому методу. Затем можно описать и добавить в соответствующий
класс сам создаваемый метод по форме
имя Сообщения
"комментарии"
| локальные переменные сообщения |
^ возвращаемый результат.
Таблица 3.9
Циклические конструкции языка Smalltalk
Запись
Содержание
379
<число> разПовторнть: [блок сообщении]
[блок условия] покаЛожь: [блок сообщений]
блок условия] покаИстина: [блок сообщений]
<число1> до: <число2> через: <шаг>
выполнить:
[:<переменная> | блок сообщений]
<объект> выполнить:
[:<переменная> | блок сообщений]
<объект> выбрать:
[:<переменная> | <условие>]
<объект> исключить:
[:<переменная> | <условие>]
<объект> собрать:
[:<переменная> : сообщение]
Повторить заданное <число> раз
Пока условие ложно, выполняются сообщения
Пока условие истинно, выполняются сообщения
Выполнить блок сообщений, пока значение
<переменной>, изменяющее свое значение
с заданным шагом, принадлежит
промежутку (число1, число2)
Значение <переменной> присваивается
последовательно элементам <объект>
Изменяет <объект>, удаляя элементы, не
удовлетворяющие условию
Изменяет <объект>, удаляя элементы,
удовлетворяющие условию
Заменяет каждый элемент <о6ъекта> на результат
выполненного сообщения
В качестве примера рассмотрим определение метода поиска максимального
из
двух целых
чисел.
Объектом-адресатом будет целое число, следовательно сам метод будет принадлежать к
классу «Целое». Параметром будет второе целое число, а возвращаемым результатом - макси-
мальное из этих чисел.
Текст метода «макс» может быть следующим (комментарии приведены в кавычках):
макс: экзЦелое "имяметода с параметром"
| максимум | "список локальных переменных"
сам>экзЦелое "псевдопеременная "сам" означает объект-адресат"
еслиИстина: [максимум : = сам]
еслиЛожь : [максимум : = экзЦелое].
^Максимум.
Наследование и полиморфизм.
Создание новых объектов происходит по принципам на-
следования и полиморфизма. Сами объекты подчиняются отношению наследования, т.е. могут
быть представлены в виде иерархической структуры с помощью дерева.
Чтобы создать объект, классу посылается сообщение о создании нового экземпляра. Класс
создает экземпляр с присущей всем объектам этого класса структурой -набором переменных эк-
земпляра. Он их инициализирует и, если в этом есть необходимость, выдает созданный экземпляр
в качестве ответа на сообщение.
Например:
х:= Массив новыйЭкземпляр: 10.
(создается новый объект с именем х, класса Массив, размера 10).
Возможно создание нового экземпляра в результате выполнения некоторых сообщений.
Например:
' Привет,', 'мартышка'
(создается новый экземпляр класса «Строка», имеющий значение 'Привет, мартышка )
1/2
(объект-адресат и объект-параметр - экземпляры класса «Целое», а результат -экземпляр
класса «Дробь»)
1>2 (результат класса «Ложь»)
Каждый класс имеет одного предка, называемого
суперклассом
. Класс может иметь одного
или нескольких потомков, называемых
подклассами
.
Класс «Объект» не имеет суперкласса и является корнем дерева иерархии классов.
Всякий класс
наследует переменные экземпляра и методы своего суперкласса. Кроме того,
он может содержать новые переменные экземпляра и методы, может переопределять у наследо-
ванные.
380
Знание иерархии классов важно для
понимания процессов выдачи ответа
на сообщение.
При получении сообщения объект ищет в протоколе методов экземпляра своего класса метод с
именем, совпадающим с именем сообщения. Если такого метода нет, он ищется в списке методов
суперкласса и так далее. Когда метод обнаружен, он выполняется и выдается ответ. Если нигде,
вплоть до корня дерева, метод не будет обнаружен, выдается сообщение об ошибке. Дерево пре-
допределенных классов языка SmallTalk приведено ниже, рис. 3.18.
Рис. 3.18.
Дерево предопределенных классов языка Smalltalk