19

我找到了一些关于打开/关闭递归的解释,但我不明白为什么定义包含“递归”这个词,或者它如何与动态/静态调度进行比较。在我找到的解释中,有:

开放递归。大多数带有对象和类的语言提供的另一个方便的特性是,一个方法体能够通过一个特殊的变量调用同一对象的另一个方法,self或者,在某些语言中,this. self 的特殊行为是它是后期绑定的,允许在一个类中定义的方法调用稍后在第一个子类中定义的另一个方法。[拉尔夫欣策]

...或在维基百科中:

的调度语义this,即对 this 的方法调用是动态调度的,称为开放递归,意味着这些方法可以被派生类或对象覆盖。相比之下,函数的直接命名递归或匿名递归使用封闭递归,具有早期绑定。

我还阅读了 StackOverflow 问题:什么是开放递归?

但我不明白为什么要用“递归”这个词来定义。当然,如果一个人通过执行“开放递归”来使用......方法递归调用,它可能会导致有趣(或危险)的副作用。但是这些定义没有直接考虑方法/函数递归调用(在维基百科定义中加上“封闭递归”,但这听起来很奇怪,因为“开放递归”并不指递归调用)。

你知道为什么定义中有“递归”这个词吗?是因为它基于另一个我不知道的计算机科学定义吗?仅仅说“动态调度”还不够吗?

4

1 回答 1

29

我试图在这里开始写一个答案,然后最终写了一篇关于它的完整博客文章。TL;DR 是:

因此,如果您将真正的面向对象语言与仅具有结构和函数的更简单的语言进行比较,区别在于:

  • 所有的方法都可以互相看到和调用。它们的定义顺序无关紧要,因为它们的定义是“同时的”或相互递归的。
  • 基本方法可以访问派生的接收器对象(即其他语言中的 this 或 self),因此它们不会彼此封闭。它们对被覆盖的方法开放。

因此:开放递归。

于 2013-08-26T18:27:53.830 回答