値をスロットに保存する方法と、スロットを読み取ったときに返される値を制御したいと考えています。ここに私のクラス定義は次のとおりです。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メソッドは、必要なものを返します。 beforeメソッドは影響を与えません。 –
@ andrei-n aroundメソッドの戻り値を変更すると、後でサブクラスに問題が発生する危険性があります。基本的な方法は、異なる動作が必要なときに常に上書きできますが、周囲のメソッドを取り除く簡単な方法はありません。個人的には、既存のメソッドに余分な機能を追加する必要があるときに、before/around/after -methodsが良いと言っていますが、主要な機能のためにはプライマリメソッドを定義することをお勧めします。 – jkiiski