Для пользователя броузер представляет собой большое окно, разделенное на пять окошек— четыре маленьких и одно большое(рис. 3.4). Каждое из верхних окон имеет полосы прокрутки. Нижнее окно используется для высвечивания и редактирования информации. Броузер управляется посредством мыши, которая должна иметь три кнопки: левая кнопка используется для операций выбора и редактирования, средняя и правая кнопки вызывают меню с операциями.
Классы в языке Smalltalk сгруппированы в категории. В первом окне прокручивается список всех категорий, известных системеSmalltalk. Хотя можно создать новую категорию, для наших целей достаточно выбрать существующую категорию и сконструировать относящийся к ней новый класс. Выбор элемента»Graphics-Primitives» в первом окне приведет к выполнению двух действий: во втором окне отобразится список всех классов, относящихся к данной категории, а в большом окне редактирования появится текст сообщения, вызываемого при создании новых классов.
После редактирования с использованием мыши пользователь может заменить это сообщение на:
Object subclass: #Card instanceVariableNames: ‘suit rank’ classVariableNames: » poolDictionaries: »
category: ‘Graphics-Primitives’
В данный момент мы будем рассматривать это сообщение просто в качестве иллюстрации того, чтоCard создается как подклассObject.
Каждый экземпляр класса Card содержит два поля данных. Как и в языкеDelphi Pascal, все классы должны быть подклассами уже существующих классов. КлассObject является наиболее общим порождающим классом.
Заметим, что имена полей данных не связаны скаким-либоконкретным типом данных. ЯзыкSmalltalk не имеет операторов объявления типа, и переменные могут принимать произвольные значения. Мы поговорим о принципиальной разнице между языками с типами данных и языками без таковых позднее, при обсуждении пересылки сообщений. В нашем классе нет переменных класса ипеременных-словарей(pool variables). Эти понятия относятся к следующему уровню сложности. Переменные класса будут обсуждаться в последующих главах. Переменные-словаривыходят за рамки настоящей книги.
Знак # перед словомCard идентифицирует его как символ. Наиболее важное свойство символов— однозначное соответствие между именем и значением. То есть именованные символы могут иметь различные значения, но все символы с одним именем соответствуют одному и тому же значению. Тем самым символы обычно используются как ключи или заменители категорий.
Закончив с определением характеристик нового класса, пользователь выбирает командуaccept из меню операций. Теперь новый класс введен в систему, и третье окно высвечивает разрешенные операции(первоначально список пуст).
Выбор окна с группами операций активизирует последнее окно в верхней группе — в нем указаны конкретные методы. Как и со списком категорий, при выборе имени группы в четвертом окне высвечиваются существующие методы, принадлежащие группе; одновременно в нижнем окне выводится шаблон, который может редактироваться для генерирования новых методов. Подобный шаблон редактирования показан на предыдущем рисунке.
Чтобы создать новый метод, пользователь редактирует шаблон и выбирает командуaccept из меню операций, когда редактирование закончено. Ниже показан метод, инициализирующий масть и ранг игральной карты.
setSuit: s rank: r
» устанавливает значения переменных экземпляра suit и rank » suit := s.
rank := r
В языке Smalltalk аргументы разделяются ключевыми словами, которые легко распознаются, поскольку оканчиваются двоеточием(идентификаторы не могут оканчиваться двоеточием). Тем самым именем метода, определенного выше, являетсяsetSuit:rank:. Метод имеет два аргумента, которые известны ему как идентификаторыs иr. В некоторых версиях языкаSmalltalk оператор присваивания записывается как стрелка, в большинстве других версий используется более традиционное обозначение:=. Наконец, можно заметить, что точка применяется в качестве разделителя операторов, и для последнего оператора ее можно опустить.
Доступ к переменным экземпляра не из методов класса в языке Smalltalk запрещен. Следовательно, мы должны определить явные функции доступа(accessor functions). Методsuit, показанный ниже, возвращает текущее значение переменной экземпляра с тем же именем:
suit
» вернуть значение масти для данной карты » suit
Стрелка, направленная вверх, — это то же самое, что ключевое словоreturn в других языках программирования. Она показывает, что следующее за ней выражение возвращается в качестве результата при выходе из метода. Заметим, что методам разрешено иметь те же имена, что и переменным экземпляра, и никакой путаницы не возникает(по крайней мере для системы— мы ничего не можем сказать о программистах).
Целые числа от 1 до13 — это значения, представляющие ранг карты(то есть значение поляrank). Мы будем использовать символы(в смыслеSmallTalk) для представления