为什么称它为"开放(或封闭)递归?

Vin*_*ren 16 oop programming-languages definition this dynamic-dispatch

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

打开递归.大多数语言使用对象和类提供的另一个便利功能是一个方法体通过一个名为self或在某些语言中调用的特殊变量来调用同一对象的另一个方法的能力this.self的特殊行为是它是后期绑定的,允许在一个类中定义的方法在第一个类的某个子类中调用稍后定义的另一个方法.[ Ralf Hinze ]

......或者在维基百科:

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

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

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

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

mun*_*ent 25

我试着在这里开始写一个答案,最后写了一篇关于它的整篇博文.TL; DR是:

因此,如果将真正的面向对象语言与仅具有结构和功能的简单语言进行比较,则差异为:

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

因此:开放递归.

  • 谢谢!你的博客文章很清楚,真的回答了我的问题.所有这些都来自功能编程词汇.还要感谢您的参考. (2认同)