На этом шаге мы рассмотрим описание свойств и методов.
Содержащиеся в объекте данные находятся в переменных, которые называются переменными экземпляра (Instance Variables) или свойствами (Attribute). Переменные экземпляра являются локальными переменными каждого объекта; у них есть имя и значение. У объектов одного типа переменные экземпляра имеют одинаковые имена, но их значения, разумеется, могут отличаться.
Значения переменных экземпляра определяют состояние объекта, которое индивидуально и меняется во времени для каждого объекта. Состояние объекта можно исследовать и изменять с помощью методов объекта.
Предусмотренные в объекте действия называются методами (Method). Методы - это функциональные свойства, определяющие использование объекта в виде функции или процедуры с побочным эффектом. Набор методов не фиксирован, поэтому его можно расширять, определяя новые методы.
Определение метода флэйвера производится при помощи формы DEFMETHOD:
(DEFMETHOD (FLAV . METH) ARGS . BODY)
Форма связывает определение флэйвера FLAV с методом METH, который вызывается с аргументами ARGS, задаваемыми лямбда-списком. Телом метода BODY является произвольное выражение языка LISP.
Например:
; Определение метода :ВРАЩАЙСЯ (DEFMETHOD (ТЕЛО :ВРАЩАЙСЯ) ; Флэйвер и метод ; ---------------------------------------------------- (ОТНОСИТ-УГОЛ ПЕРЕМЕЩЕНИЕ OLDX OLDY) ; Аргументы метода ; ---------------------------------------------------- (SETQ ОТНОСИТ-УГОЛ ; СКОРОСТЬ ПЕРЕМЕЩЕНИЕ) ; (LOOP ; ( (= ОТНОСИТ-УГОЛ 0) ) ; Т е л о ... ... ) ; м е т о д а ) ; ) ;
В объектно-ориентированном программировании вычислениями управляют в основном с помощью методов, вызывающих друг друга, подобно вызову процедур в традиционном программировании. Однако на последовательность применения методов могут повлиять связанные с ними методы-демоны.
Методы-демоны (Daemon Method), или короче, демоны, - это вспомогательные методы, которые объявляются вместе с определением основного метода. Если основной метод получит сообщение, то без упоминания вычисляется и демон.
Демоны бывают двух сортов [1, с.115-116]: пред- и постдемоны. Преддемон (Befor-Daemon) - это метод, который выполняется всегда перед выполнением основного метода. Постдемон (After-Daemon) выполняется соответственно после выполнения основного метода.
С помощью пред- и постдемонов можно, например, проследить, когда некоторое сообщение посылается или возвращается объектом, изменить другие объекты на основе получаемых или посылаемых сообщений и т.д.
Тип демона выражается ключевыми словами :BEFORE и :AFTER (пред- и постдемоны).
Например:
(DEFMETHOD (ПЛАНЕТА :AFTER :ВРАЩАЙСЯ) ; Флэйвер и метод ; с постдемоном ; -------------------------------------------------- (ОЧЕРЕДНОЙ-СПУТНИК) ; Аргументы метода ; -------------------------------------------------- (SETQ S СПИСОК-СПУТНИКОВ) ; (LOOP ; ( (NULL S) ) ; Т е л о (SETQ ОЧЕРЕДНОЙ-СПУТНИК ; (POP S)) ; м е т о д а ... ... ; ) )
Композицию методов можно осуществлять не только по времени через пред- и постдемоны, но и другими средствами. Способ композиции методов можно выражать, например, функцией, на основе которой определяется вычисление методов, связанных с известным сообщением или ситуацией. Например, композиция методов с помощью функции AND вычисляется до тех пор, пока не встретится первый метод, значение которого NIL.
На следующем шаге мы рассмотрим обмен сообщениями.