我正在尝试解决Common Lisp CLOS中典型的钻石继承问题。以下是代码:
(defclass C1.0 () ... )
(defclass C2.1 (C1.0) ...)
(defclass C2.2 (C1.0) ...)
(defclass C3.0 (C2.1 C2.2) ...)
(defmethod m1 ((obj C1.0)) ...)
(defmethod m1 ((obj C2.1)) ...)
(defmethod m1 ((obj C2.2)) ...)
(defmethod m1 ((obj C3.0))
; Here I want to call the C2.2 version of
; m1
...)
还假设C1.0、C2.1和C2.2的代码在一个我无法访问的库中,因此我无法对其中任何内容进行修改。进一步地,还要假设其他一些类也将从C2.2派生,而且可能不想调用C2.2版本的m1,因此我不能使用:before向C2.2添加任何内容。使用call-next-method将调用C2.1版本。
仅供澄清,以下是如何在Python中解决该问题的方法:
class C1_0 :
def m1 (self) : ...
class C2_1 (C1_0) :
def m1 (self) : ...
class C2_2 (C1_0) :
def m1 (self) : ...
class C3_0 (C2_1, C2_2) :
def m1 (self) :
C2_2.m1 (self) # <-- This is the solution
...