我正在阅读Sonja Keene的“公共Lisp中面向对象的编程”一书。
在第二章中,作者说:
确定调用哪些方法然后调用它们的过程称为泛型分派。每当调用泛型函数时,它都会自动发生。
这让我想起了动态调度定义(根据维基百科):
动态调度是在运行时选择要调用的多态操作的实现的过程。它通常用于面向对象的编程语言和系统,并被认为是其主要特征.
不幸的是,维基百科没有,而不是,有一条关于泛型分派的条目。
因此,我想问:
动态调度和一般调度基本上是一回事吗?有什么相似之处?
2-两者有什么不同?动态调度是否是由于CLOS的灵活性而导致的泛型分派的某种子集?
发布于 2021-06-09 08:41:02
一般说来,泛型分派只是指根据一个或多个参数选择泛型函数的实现。
这适用于单个调度(比如Lisp的口味系统)或多个调度(比如Lisp的CLOS)。
在CLOS和function中,一个泛型函数捆绑了各种方法。这些方法可能是不同的方法类型(主、前、后、.)和/或专门针对一个或多个参数类型的。
风味和CLOS的通用分派选择适用的方法并计算一个有效的方法,然后使用提供的参数调用这个方法。
示例:
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以多个分派和方法组合的形式支持通用调度。
发布于 2021-06-09 06:32:49
是的,CLOS中的分派也是动态的(这也称为后期绑定)。
不,动态调度和泛型调度不是一回事,因为通用和动态两个词回答不同的问题。
单词dynamic的要点是决定在运行时调用哪种方法。与此形成对比的是静态分派(有些人不会调用分派,而会调用重载),其中的决定是在编译时作出的。
泛型一词的要点是,关于调用哪种方法的决定是根据所有(所需)参数的类型作出的。这些方法被附加到泛型函数。与此形成对比的是基于类的分派,其中只对第一个参数的类作出决定,并将方法附加到该类。
https://stackoverflow.com/questions/67896358
复制相似问题