我想控制值保存在插槽中的方式以及讀取插槽時返回的內容。這裏是我的類定義: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方法中更改返回值可能會在稍後導致子類出現問題。當需要不同的行爲時,主要方法總是可以被重寫,但是沒有簡單的方法來擺脫周圍方法。就個人而言,我會說,在必須爲現有方法添加額外功能之前/之後/之後方法很好,但定義主要方法應該是核心功能的首選。 – jkiiski