【发布时间】:2015-01-20 08:29:38
【问题描述】:
我正在尝试在 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 真正向 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
...
【问题讨论】:
标签: inheritance lisp common-lisp diamond-problem clos