Я хотел бы контролировать способ сохранения значений в слотах и то, что возвращается, когда я читаю слот. Вот мое определение класса:Common Lisp: как заменить слот-аксессоры?
(defclass object()
((name :accessor name-access
:initform 'noname
:initarg :name)
(value :accessor value-access
:initform 10
:initarg :value)))
Я создаю объект таким образом:
(setf obj1 (make-instance 'object))
Это так, как я получаю значение слота name
:
(name-access obj1)
, и как Я установил новое значение:
(setf (name-access obj1) 'realname)
Каков правильный способ переопределить эту функцию (или метод) доступа, чтобы иметь возможность внести некоторые изменения в объект (при записи) и управлять возвращаемым значением?
спасибо.
Спасибо. Кажется, что в некоторых сообществах это считается лучшим способом, чем переопределение аксессуаров. Но можно ли изменить возвращаемое значение с помощью методов ': before' или': around'? –
@ andrei-n: см. Пример. Метод around возвращает все, что он хочет. Метод до этого не влияет. –
@ andrei-n Изменение возвращаемого значения в методе around может вызвать проблемы для подклассов позже. Первичный метод всегда можно переопределить, когда требуется другое поведение, но нет простого способа избавиться от метода around. Лично я бы сказал, что методы before/around/after-good хороши, когда вам нужно добавить дополнительные функции к существующему методу, но определение основного метода должно быть предпочтительным для основных функций. – jkiiski