1.2. Смолтоковская реализация ООМП 31
То, что мы рассмотрели, не отвечает на главный вопрос: как объект,
получивший сообщение, находит метод, который надо выполнить? Остано-
вимся подробно на механизмах поиска по сообщению необходимого метода
и его выполнения. Итак, как уже отмечалось, выполнение любого действия
в системе Смолток осуществляется с помощью посылки объекту сообще-
ния. Получив сообщение, получатель ищет метод с соответствующим сооб-
щению шаблоном, начиная поиск обычно со своего класса. Если объект —
класс, то метод ищется среди методов класса, а если объект — экземпляр
класса, то среди методов экземпляра класса. Если метод с соответствую-
щим шаблоном находится в классе получателя, то он выполняется, и как
результат его выполнения обязательно возвращается некоторый объект, ко-
торый информирует того, кто послал сообщение, что выполнение метода
завершилось с содержащимся в возвращаемом объекте результатом.
А если метода с нужным шаблоном нет в классе? Тогда к работе под-
ключается иерархия классов, а точнее, цепочка суперклассов для класса
объекта-получателя. Если в классе подходящего метода нет, метод ищет-
ся в ближайшем его суперклассе. Если нужного метода нет в суперклассе,
то поиск продолжается в следующем по иерархии суперклассе и так да-
лее, пока не доберемся до класса Object. А если нужного метода нет и
там? Тогда виртуальная машина посылает объекту-получателю сообщение
doesNotUnderstand:. Cоответствующий ему метод, определенный в классе
Object, возбуждает ошибку времени выполнения (см. разд. 3.3).
Таким образом, посылка сообщения включает в себя:
• определение объекта, которому посылается сообщение;
• определение, если они нужны, объектов-аргументов сообщения;
• определение метода, который ищется в классе или суперклассах;
• выполнение метода и возвращение некоторого объекта.
Что же произойдет в ответ на Association key: ’Index’ value: 344017?
Начнется поиск метода с именем key:value: среди методов класса в классе
Association. Там такой метод есть, и он выполнится.
Давайте посмотрим на то, как он будет выполняться. Тело этого метода
очень простое и состоит всего из одного выражения ^(self key: aKey) va-
lue: anObject. При сравнении с шаблоном сообщения параметр aKey станет
равным строке ’Index’, а параметр anObject — целому числу 344017. После
этого начнет выполняться выражение ^(self key: ’Index’) value: 344017. В
начале выражения стоит символ возврата значения, следовательно, тот объ-
ект, который получится в результате вычислений, и будет возвращен ме-
тодом как результат его выполнения. Первая часть выражения заключена
в круглые скобки (self key: ’Index’), поэтому вычисляется первой. Первое
слово в скобках — имя псевдопеременной self. Более подробно о ней мы