假设我编写了以下代码(请原谅任何错误,我是 Lisp 新手,我无法在这台机器上运行 CL)
(defclass o () ())
(defclass a (o) ())
(defclass b (o) ())
(defgeneric m (x))
(defmethod m ((x o))
(print "O")
)
(defmethod m ((x a))
(print "A")
(call-next-method (make-instance 'a))
)
(defmethod m ((x b))
(print "B")
(call-next-method (make-instance 'b))
)
(setq aa (make-instance 'a))
(m aa) ;prints A, then O
(setq bb (make-instance 'b))
(m bb) ;prints B, then O
根据我的期望,它应该打印评论中写的内容而没有任何抱怨。
如果我添加以下代码会发生什么?
(defclass c (a b) ())
(setq cc (make-instance 'c))
(m cc)
如果我理解标准方法组合,适用的方法cc
将被排序为(m a)
, (m b)
, (m o)
, 并且(m b)
不会被call-next-method
成功调用。但实际上会发生什么?当我定义类c
并说它使泛型函数的方法链无效时,CL 会抱怨m
吗?还是会出现运行时错误?