【发布时间】:2023-03-20 01:55:01
【问题描述】:
我发现在 Common Lisp 中进行面向对象编程很痛苦。主要问题是方法的命名。请看下面的代码。
(defclass foo () ())
(defmethod action ((object foo))
(write-line "hello"))
(defclass bar () ())
(defmethod action ((object bar) boo)
t)
(print
(action (make-instance 'foo)))
(print
(action (make-instance 'bar) 1))
这两个action 方法不是同一个泛型函数的不同实现。他们有相同的名字是偶然的。
但是 Common Lisp 要求所有同名的方法具有相同数量的参数。
为了避免名称冲突,我通常在方法名称前加上类名,例如foo-action 和bar-action。但这会导致代码在实际程序中非常冗长,例如(lengthy-class-name-do-something some-variable).
其他面向对象的编程语言,如 C++ 和 Java,没有这样的问题。你可以像some_variable.do_something() 这样写,其中没有名称冲突。
所以我想知道对于上述问题是否有更好的解决方案?
【问题讨论】:
-
"但是 common lisp 要求所有同名方法有相同数量的参数。"这是因为如果您不自己创建,CL 将从
defmethod创建一个通用函数defgeneric。泛型函数定义了参数的数量。
标签: generics common-lisp naming