我发现在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()
,其中它们之间不存在名称冲突。因此,我想知道是否存在更好的解决上述问题的方法?
defmethod
创建一个通用函数defgeneric
。通用函数定义了参数的数量。 - Manfred