Рассмотрим класс account
:
(defclass account ()
((name :initarg :name :reader name)
(balance :initarg :balance :initform 0.00 :accessor balance)
(interest-rate :allocation :class :initform 0.06
:reader interest-rate)))
Для этого класса мы определяем метод withdraw
:
(defmethod withdraw ((acct account) amt)
(if (< amt (balance acct))
(decf (balance acct) amt)
'insufficient-funds))
И еще один класс password-account
, который является подклассом account
:
(defclass password-account (account)
((password :initarg :password :reader password )))
И метод withdraw
для этого класса:
(defmethod withdraw ((acct password-account) amt pass)
(if (equal (password acct) pass)
(call-next-method acct amt )
'wrong-password))
Но это дает ошибку:
The generic function
#<STANDARD-GENERIC-FUNCTION COMMON-LISP-USER::WITHDRAW (1)>
takes 2 required arguments; was asked to find a method with
specializers
(#<STANDARD-CLASS COMMON-LISP-USER::PASSWORD-ACCOUNT>
#1=#<SB-PCL:SYSTEM-CLASS COMMON-LISP:T> #1#)
[Condition of type SB-PCL::FIND-METHOD-LENGTH-MISMATCH]
See also:
Common Lisp Hyperspec, FIND-METHOD [:function]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1005308033}>)
Почему это происходит? И что делает
попросили найти метод со специалистами
значит здесь?
Здесь у основной функции withdraw
было два аргумента acct
и amt
, поэтому, чтобы вызвать ее из более конкретного метода, который использует 3 аргумента вместо 2, мы можем предоставить call-next-method
аргументы менее конкретного метода withdraw
. Но это все еще не работает.
Любая помощь приветствуется.
call-next-method
с аргументами? Поскольку все методы потребуют одинакового количества аргументов. (При этом те же аргументы) - person Mooncrater   schedule 18.06.2017pass
необязательным должно помочь. - person Mooncrater   schedule 18.06.2017