gpt4 book ai didi

overriding - 普通口齿不清 : how to override slot accessors?

转载 作者:行者123 更新时间:2023-12-02 06:15:12 30 4
gpt4 key购买 nike

我想控制值在槽中的保存方式以及读取槽时返回的内容。这是我的类定义:

(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

本书Practical Common Lispchapter 17 中查看这些内容.你应该读一下。

关于overriding - 普通口齿不清 : how to override slot accessors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722892/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com