- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到过这样的说法,即 Common Lisp 对象系统 (CLOS) 优于传统的(基于类的)面向对象系统。 Wikipedia entry for CLOS提到了这两种方法之间的差异——主要是多重分派(dispatch)以及 CLOS 中的类和方法的分离。这些仅仅是CLOS的差异还是真正的优势?
最佳答案
取决于你认为什么是优势。
首先 CLOS 是一个基于类的对象系统,与基于非类的面向原型(prototype)的对象系统相比。 CLOS 具有多重继承的类。 CLOS 对象是类的实例。
CLOS 不使类命名空间。 CLOS 也不让方法驻留在类和这些类的命名空间中。
这意味着 CLOS 不是消息传递 OO .不将消息传递给某个对象,然后该对象运行相应的方法。
历史上早期的 Lisp 对象系统(CLOS 就是从该系统开发的)开始是传统的基于类的消息传递系统(LOOPS,Flavors)。经过几年的实验和研究,CLOS 模型被认为更适合 Lisp 并且更强大。
CLOS 使用通用函数模型 ,其主要优点是它更适合函数式编程范式。 CLOS 使用泛型函数的函数调用。泛型函数可以有多个参数,并且可以调度多个参数。
这适用于 Common Lisp 的其余部分,因为其他函数也可以有多个参数。 CLOS 泛型函数也可以传递、从函数返回或存储在数据结构中。所以它们也是一流的功能。如果你发现这些东西(高阶函数和多重分派(dispatch))有用,那么 CLOS 就有优势。此外,CLOS 通用函数本身就是 CLOS 对象。
有几件事与其他基于类的 OO 系统不同——上面已经提到了每个类没有命名空间以及方法不是按类组织的。由于 CLOS 不是消息传递 OO,因此将发送到某个对象的所有消息转发到另一个对象并不适用 - 如果没有消息传递,我们将无法转发不存在的消息。
一个明显的可能优势是,由于 CLOS 类不捆绑方法,并且方法可以单独定义,因此类和方法集不是封闭的。可以随时添加或删除新方法。这意味着对于新的或更改的功能,不需要源代码,以某种方式“重新打开”一个类,甚至子类化一个类来将新功能添加到子类中。所有这些在 CLOS 中都是不必要的。
其他一些可能的优势:
关于oop - CLOS 相对于其他基于类的 OO 系统的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066355/
我相信 OO,但不至于应该使用不适当的设计/实现来实现“OO 兼容”。 那么,如何应对 Serlvet/EJB/DataContainer 分层架构: Servlet 接收请求并调用“业务层”(例如
我有一个员工分为两类(国内和国际)。我还有一个类Refund,是用来给员工退款的。我有一个名为银行账户的类,由 Refund 类用于退款。 现在我的直接设计是这样的: 员工界面,分国内和国际2个子类型
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
为什么基于类的 OO 而不是基于原型(prototype)的 OO 如此受欢迎?他们在学校教后者吗?尽管 Javascript 是基于原型(prototype)的,但大多数人主要在功能上使用它,或者通
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 在面向对象编程中,子类型化和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个
我想在类中动态定义方法。我正在写一个跟踪器,比下面的框架稍微复杂一些,它也有状态意识,但这与我的问题无关。我写了一个 TraceSlave 类,它带有调用 sprintf 的跟踪方法,用文本\n 替换
如果你看过Going Deep shows of the Channel9最近,一个经常被提及的话题是mathematical duality在编程中。 TomasP 有一个不错的blog post关
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我是软件设计原则的忠实粉丝,例如 固体 和 干 .面向对象软件设计还有哪些其他原则? 笔记。我不是在寻找诸如“评论您的代码”之类的答案,而是在寻找 OO 设计原则,例如 Uncle Bob 讨论的那些
我找不到主要区别。我很困惑什么时候可以使用继承,什么时候可以使用子类型。我找到了一些定义,但它们不是很清楚。 面向对象编程中的子类型和继承有什么区别? 最佳答案 除了已经给出的答案,这里还有一个 li
这个问题已经有答案了: Javascript: Do I need to put this.var for every variable in an object? (6 个回答) 已关闭 9 年前。
我正在构建一个应用程序,该应用程序在一个对象内有一个对象数组,而它的自身位于一个数组中。我希望能够从子对象访问父对象的属性。我知道我可以简单地通过索引引用父级,如下所示: var parents =
我有一个像这样的html页面 和 2 个像这样的 JavaScript 文件 /// /// /// $(document).ready(fu
我正在尝试用 javascript 做一个巨大的 Web 应用程序,如果我不想搞乱一切,我想我必须以面向对象的方式来做。因此,我进行了很多搜索,发现了很多在 JS 中声明类和创建实例的不同方法,例如环
我在理解 OO 模式如何工作时遇到了一些问题,我的讲师给了我以下问题,但我思考了一整天后无法解决它 我的问题的场景。 有一个名为“ShapeManager”的类,用于管理 Shape 对象。名为“Sh
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
我正在阅读科学 paper关于 Robert martin 编写的 OO Design Quality Metrics。 在他的论文中,他描述了“一组指标,可用于衡量面向对象设计的质量,根据该设计的子
我有一个与 OOP 相关的问题。我有一个界面,说: class MyInterface { public int getValue(); } 在我的项目中,这个接口(interface)由 7
是否有更好的Pythonic/面向对象方法来选择在运行时执行哪个特定类方法,具体取决于对象的类型,因为使用 type() 方法不被认为优雅(?) 我为我正在使用的三种数据类型编写了以下代码。它基本上将
就 Perl OO 而言,-> 到底做了什么? 例如我打了一个主电话: $result = a::b->mymethod( ); 在我定义 mymethod() 的包中,我使用了以下内容: m
我是一名优秀的程序员,十分优秀!