【发布时间】:2015-07-10 05:34:06
【问题描述】:
假设我编写了以下代码(请原谅任何错误,我是 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
按照我的预期,它应该可以毫无怨言地打印出 cmets 中所写的内容。
如果我添加以下代码会发生什么?
(defclass c (a b) ())
(setq cc (make-instance 'c))
(m cc)
如果我理解标准方法组合,cc 的适用方法将排序为(m a)、(m b)、(m o) 和(m b),不会被call-next-method 成功调用。但实际上会发生什么?当我定义类c 并说它使泛型函数m 的方法链无效时,CL 会抱怨吗?还是会出现运行时错误?
【问题讨论】:
-
我猜你想让第一个
defmethod专门针对o的论点,对吧? -
你应该使用
make-instance而不是allocate-instance,并且它需要一个符号,所以你需要在字面上引用它。 -
我只使用规范编写代码,所以我可能会犯一些错误。谢谢。
标签: common-lisp multiple-inheritance overriding clos