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)

为了重写对象(写时)并控制返回值,重写该访问器函数(或方法)的正确方法是什么?

谢谢你。

吉斯基

您可以手动定义获取和设置插槽的方法:

(defclass foo ()
  ((name :initform 'noname
         :initarg :name)))

(defgeneric name-access (foo)
  (:method ((foo foo))
    (format t "~&Getting name.~%")
    (slot-value foo 'name)))

(defgeneric (setf name-access) (name foo)
  (:method (name (foo foo))
    (format t "~&Setting a new name.~%")
    (setf (slot-value foo 'name) name)))

(defparameter *foo* (make-instance 'foo))
(name-access *foo*)
; Getting name.
;=> NONAME

(setf (name-access *foo*) 'some-name)
; Setting a new name.
;=> SOME-NAME

(name-access *foo*)
; Getting name.
;=> SOME-NAME

实用的通用Lisp》一书第17章介绍了这些内容您应该阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章