我找到了一些关于打开/关闭递归的解释,但我不明白为什么定义包含“递归”这个词,或者它与动态/静态调度的比较。在我发现的解释中,有:
打开递归。大多数人提供的另一个便利功能 具有对象和类的语言是一种方法的能力 body通过特殊方法调用同一对象的另一个方法 名为
self
的变量,或者在某些语言中,this
。特别的 self的行为是它是后期绑定的,允许定义一个方法 在一个类中调用稍后定义的另一个方法 第一个的一些子类。 [Ralf Hinze]
...或Wikipedia:
this
的调度语义,即对此方法调用的动态调度,称为 open recursion ,意味着这些方法可以被派生类或对象覆盖。相比之下,直接命名递归或函数的匿名递归使用闭合递归,具有早期绑定。
我还阅读了StackOverflow问题:What is open recursion?
但我不明白为什么“递归”一词用于定义。当然,如果通过执行方法递归调用来使用“开放递归”,它可能会导致有趣(或危险)的副作用。但是定义不直接考虑方法/函数递归调用(在维基百科定义中使用“封闭递归”,但听起来很奇怪,因为“打开递归”并不是指递归调用)。
你知道为什么定义中有“递归”这个词吗?是因为它是基于另一个我不知道的计算机科学定义吗?应该简单地说“动态调度”还不够吗?
答案 0 :(得分:24)
我试着在这里开始写答案然后最后写了一篇关于它的entire blog post。 TL; DR是:
因此,如果将真实的面向对象语言与仅具有结构和功能的简单语言进行比较,则差异为:
- 所有方法都可以互相看到和调用。它们的定义顺序并不重要,因为它们的定义是“同时”或相互递归。
- 基本方法可以访问派生的接收器对象(即其他语言中的this或self),因此它们不会彼此关闭。它们打开以覆盖方法。
因此:打开递归。