Объектно-ориентированное программирование

Для пользователя броузер представляет собой большое окно, разделенное на пять окошек— четыре маленьких и одно большое(рис. 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) для представления