我试图在 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 派生并且可能不想调用 m1 的 C2.2 版本,所以我不能真正使用:before
. 使用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
...