Dim*_*tri 2 lisp common-lisp clos
我有以下两个类:
(defclass person () ())
(defmethod speak ((s person) string)
(format t "-A" string))
(defmethod speak :before ((s person) string)
(print "Hello! "))
(defmethod speak :after ((s person) string)
(print "Have a nice day!"))
(defclass speaker (person) ())
(defmethod speak ((i speaker) string)
(print "Bonjour!"))
(speak (make-instance 'speaker) "Can I help yoU?")
Run Code Online (Sandbox Code Playgroud)
而这个的输出是:
"Hello! "
"Bonjour!"
"Have a nice day!"
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是这些方法是如何按照"顺序"执行的.我似乎无法掌握正在发生的事情和原因.据说有一个规则优先于此,但我不知道在哪里找到它.例如,为什么"Hello!Can I help you"
在这种情况下不会发射?
当您没有任何around方法时,方法应用程序的顺序是:所有方法之前从最具体到最不具体,然后是最具体的主要方法,然后是从最不具体到最具体的后方法.在您的情况下,您有两个主要方法(方法没有:名称旁边的或之前):一个指定人,另一个指定扬声器.由于说话者比人更具体,因此只调用说话者主要方法.如果要调用多个主要方法,请查看call-next-method.