oop - 即使类和函数/方法之间没有直接联系,使用 defmethod 而不是 defun 是否合理

标签 oop coding-style common-lisp

考虑这个例子:

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 中的方法与您注意到的语言的工作方式并不完全相同(有关详细信息,请参阅 appropriatechaptersPractical Common Lisp)。简而言之,在非常高的层次上,您需要将 lisp 中的 OO 视为“专门针对类的方法”而不是“类具有方法”。

也就是说,是的,我认为包具有专门用于在别处定义的类的方法是完全合理的。指定您期望的输入类型可以阐明 future 读者的意图(可能有助于也可能不会有助于优化,但从我的角度来看,这并不是非常重要)。如果您的包是 defining an ASDF system,请确保 import 是合适的符号,depends-on 是合适的包。

就像脚注一样,请注意 Common Lisp 作为一种语言并不是特别面向对象(例如,如果您决定某个特定类应该具有 lengthpoppush 方法,或者专门针对算术运算)。

关于oop - 即使类和函数/方法之间没有直接联系,使用 defmethod 而不是 defun 是否合理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11796271/

相关文章:

Java getter/setter 风格问题

lisp - CentOS 7 上的 Common Lisp

asp.net - 如何在我的代码中使用接口(interface)使其更具可扩展性?

javascript - 向函数添加自定义属性

Python 实例变量显然共享数据

coding-style - 如何为不同的 clang-format 版本维护 .clang-format 文件?

c - C 应用程序中变量和函数的命名约定

java - 在构造函数中初始化另一个类的对象

function - 在 Lisp 中,如何通过作为参数传递的名称从宏中调用函数?

lisp - 在 lisp 中用深度递归删除