Стили и методы программирования


Объекты и LISP - часть 2


Если система находит несовместимость в определении порядка, то она выдает ошибку, как в следующем примере:

[6]> (defclass init () ()) #<STANDARD-CLASS INIT> [7]> (defclass a (init) ()) #<STANDARD-CLASS A> [8]> (defclass b (init) ()) #<STANDARD-CLASS B> [9]> (defclass c1 (a b) ()) #<STANDARD-CLASS C1> [10]> (defclass c2 (b a) ()) #<STANDARD-CLASS C2> [11]> (defclass contr (c1 c2) ()) *** - DEFCLASS CONTR: inconsistent precedence graph, cycle (#<STANDARD-CLASS A> #<STANDARD-CLASS B>)

В CLOS могут задаваться методы, отличающиеся от функций тем, что их аргументы специфицированы, например

(defmethod inspectpet ((x pet) (y float)) (setf weightofanimal 3.5))

Как видно из этого примера, методы не обязательно связаны с классами. Они могут быть связаны с любыми типами. Методы в CLOS могут иметь дополнительные спецификации. Для того, чтобы разобраться, как эти спецификации взаимодействуют с упорядочением типов классов, рассмотрим следующую программу и генерируемый при ее исполнении результат.

(defclass thing () ((weight :initform ’(0 kg) :accessor weightof :initarg :weight))) (defclass animal (thing) ((specie :accessor specieof :initarg :spec) (sex :accessor sexof :initform ’m :initarg :sex))) (defclass possession (thing) ((owner :accessor ownerof :initform ’nnn) (cost :accessor costof :initform ’(0 bucks) :initarg :cost)) ) (defclass person (animal) ((specie :initform ’human) (name :initarg :thename :accessor nameof))) (defclass pet (animal possession) ((nick :initarg :thenick :accessor nickof) (specie :initform ’cat)))

(defmethod act :before ((p pet)) (print "Cat mews")) (defmethod act :after ((p pet)) (print "Cat turns")) (defmethod act :around ((p pet)) (progn (print "You have a cat") (call-next-method)))

(defmethod act ((p animal)) (progn (print "Animal is close to you") (call-next-method))) (defmethod act :before ((p animal)) (print "You see an animal")) (defmethod act :after ((p animal)) (print "You send the animal off")) (defmethod act :around ((p animal)) (progn (print "You don’t like wild animals") (call-next-method)))




Начало  Назад  Вперед



Книжный магазин