考虑这个例子:
There is a class named 'first', which is defined in package 'a'.
There is also a package 'b' which uses module 'a' functionalities. Certain functions of package 'b' would require a object of class 'first' as a parameter. But besides this, there is no direct logical link between package 'a' and 'b'.
现在我想知道写
(defmethod package-b-function ((param first)) #|do stuff..|#)
是否合理而不是普通函数,因为函数需要对象,并且定义一个方法将为运行时环境和包“b”的其他用户澄清这一点。我曾经用 C++/Java 编程,因此我不熟悉在这种情况下使用的 OOP 约定。
欣赏你的洞察力。
最佳答案
Common Lisp 中的方法与您注意到的语言的工作方式并不完全相同(有关详细信息,请参阅 appropriate 和 chapters 的 Practical Common Lisp)。简而言之,在非常高的层次上,您需要将 lisp 中的 OO 视为“专门针对类的方法”而不是“类具有方法”。
也就是说,是的,我认为包具有专门用于在别处定义的类的方法是完全合理的。指定您期望的输入类型可以阐明 future 读者的意图(可能有助于也可能不会有助于优化,但从我的角度来看,这并不是非常重要)。如果您的包是 defining an ASDF system,请确保 import
是合适的符号,depends-on
是合适的包。
就像脚注一样,请注意 Common Lisp 作为一种语言并不是特别面向对象(例如,如果您决定某个特定类应该具有 length
、 pop
或 push
方法,或者专门针对算术运算)。
关于oop - 即使类和函数/方法之间没有直接联系,使用 defmethod 而不是 defun 是否合理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11796271/