首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公共Lisp对象系统中的通用调度是否与经典OOP中的动态调度相同?

公共Lisp对象系统中的通用调度是否与经典OOP中的动态调度相同?
EN

Stack Overflow用户
提问于 2021-06-09 01:30:25
回答 2查看 226关注 0票数 4

我正在阅读Sonja Keene的“公共Lisp中面向对象的编程”一书。

在第二章中,作者说:

确定调用哪些方法然后调用它们的过程称为泛型分派。每当调用泛型函数时,它都会自动发生。

这让我想起了动态调度定义(根据维基百科):

动态调度是在运行时选择要调用的多态操作的实现的过程。它通常用于面向对象的编程语言和系统,并被认为是其主要特征.

不幸的是,维基百科没有,而不是,有一条关于泛型分派的条目。

因此,我想问:

动态调度和一般调度基本上是一回事吗?有什么相似之处?

2-两者有什么不同?动态调度是否是由于CLOS的灵活性而导致的泛型分派的某种子集?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-09 08:41:02

一般说来,泛型分派只是指根据一个或多个参数选择泛型函数的实现。

这适用于单个调度(比如Lisp的口味系统)或多个调度(比如Lisp的CLOS)。

在CLOS和function中,一个泛型函数捆绑了各种方法。这些方法可能是不同的方法类型(主、前、后、.)和/或专门针对一个或多个参数类型的。

风味和CLOS的通用分派选择适用的方法并计算一个有效的方法,然后使用提供的参数调用这个方法。

示例:

代码语言:javascript
复制
CL-USER 7 > (defmethod greet :before ((w world)) (princ "hello"))  
#<STANDARD-METHOD GREET (:BEFORE) (WORLD) 40200211B3>

CL-USER 8 > (defmethod greet ((w world)) (princ "world") (values)) 
#<STANDARD-METHOD GREET NIL (WORLD) 40200221F3>

CL-USER 9 > (defmethod greet :after ((w world)) (princ "."))  
#<STANDARD-METHOD GREET (:AFTER) (WORLD) 402002317B>

CL-USER 10 > (greet (make-instance 'world))
helloworld.

如您所见,泛型分派机制按照指定的顺序自动调用多个不同的可应用方法。

CLOS的通用分派还可以根据所有需要的参数及其类型选择方法,->多重分派。

汇总:CLOS中的通用调度(和口味,.)意味着选择适用的方法,将它们结合到一个有效的方法中。这是动态调度的一种特定形式。动态调度OTOH通常只是调用一个方法,并且通常只基于一个参数进行选择。然后,CLOS以多个分派和方法组合的形式支持通用调度。

票数 6
EN

Stack Overflow用户

发布于 2021-06-09 06:32:49

是的,CLOS中的分派也是动态的(这也称为后期绑定)。

不,动态调度和泛型调度不是一回事,因为通用和动态两个词回答不同的问题。

单词dynamic的要点是决定在运行时调用哪种方法。与此形成对比的是静态分派(有些人不会调用分派,而会调用重载),其中的决定是在编译时作出的。

泛型一词的要点是,关于调用哪种方法的决定是根据所有(所需)参数的类型作出的。这些方法被附加到泛型函数。与此形成对比的是基于类的分派,其中只对第一个参数的类作出决定,并将方法附加到该类。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67896358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档