Oop 什么是开放递归?

Oop 什么是开放递归?,oop,scala,programming-languages,Oop,Scala,Programming Languages,什么是开放递归?它是特定于OOP的吗 (我在年遇到这个词。)只是抄袭: “开放递归大多数对象和类语言提供的另一个便利功能是,一个方法体可以通过一个名为self的特殊变量调用同一对象的另一个方法,在某些语言中,self的特殊行为是它是后期绑定的,允许一个类中定义的方法调用另一个方法。”本文分析了将OO添加到ML中的可能性,包括表达性和复杂性。它有以下关于对象的摘录,这似乎使这个术语相对清晰—— 3.3。对象 对象的最简单形式只是共享一个公共闭包环境的函数的记录 携带对象状态(我们可以称这些简单对象

什么是开放递归?它是特定于OOP的吗

(我在年遇到这个词。)

只是抄袭: “开放递归大多数对象和类语言提供的另一个便利功能是,一个方法体可以通过一个名为self的特殊变量调用同一对象的另一个方法,在某些语言中,self的特殊行为是它是后期绑定的,允许一个类中定义的方法调用另一个方法。”本文分析了将OO添加到ML中的可能性,包括表达性和复杂性。它有以下关于对象的摘录,这似乎使这个术语相对清晰——

3.3。对象

对象的最简单形式只是共享一个公共闭包环境的函数的记录 携带对象状态(我们可以称这些简单对象)。记录的功能成员可以是,也可以不是 可以定义为相互递归。但是,如果希望通过重写来支持继承,那么 物体的形状变得更加复杂。要启用开放递归,方法的调用图将 不能硬连线,但需要通过对象自引用间接实现。对象自参考 可以通过构造实现,使每个对象成为递归的、自引用的值(定点 模型),或者动态地,通过在每个方法调用(自应用程序)上将对象作为额外参数传递 在任何一种情况下,我们都将这些自引用对象称为


开放递归允许从内部调用对象的另一个方法,通过特殊变量,如thisself“开放递归”一开始有点误导,因为它与通常使用的递归无关(函数调用自身);在这种程度上,不存在闭合递归。 它基本上意味着,一个事物是指它自己。我只能猜测,但我确实认为“开放”一词来自“开放”一词,就像“开放扩展”一词一样。 从这个意义上说,一个对象是可以扩展的,但仍然是指它自己

也许一个小例子可以对这个概念有所启发

您可以编写这样的Python类:

class SuperClass:
   def method1(self):
       self.method2()
   def method2(self):
       print(self.__class__.__name__)
如果你跑过去

s = SuperClass()
s.method1()
它将打印“超类”

现在我们从超类创建一个子类并覆盖method2:

class SubClass(SuperClass):
def method2(self):
    print(self.__class__.__name__)
然后运行它:

sub = SubClass()
sub.method1()
现在将打印“子类”

尽管如此,我们还是像以前一样只调用method1()。在method1()内部调用method2(),但两者都绑定到同一引用(Python中为self,Java中为self)。在子类化过程中,超类method2()被更改,这意味着子类的对象引用了此方法的不同版本

这就是开放递归

在大多数情况下,您重写方法并直接调用被重写的方法。 这里的这个方案使用的是自引用上的间接寻址


旁白:我认为这不是发明出来的,而是发现并解释的。

在Haskell中,“开放递归”似乎只是状态单子的一个别致的名字,或者在python中使用常规对象方法(第一个参数是
self
)进行递归。。。?这个术语是否带来了一些新的有意义的东西?是的,Python中的常规对象方法(或者露比或C++或者SimalTalk或者java或C…)可以显示开放递归。你可能认为这没什么大不了的,但如果你正式研究OO的语义,你会发现它实际上相当棘手。这个问题对我来说似乎有点误导。开放递归是一个方法体调用同一对象的另一个方法的能力(相互递归定义,这就是递归的原因),并允许在一个类中定义的方法调用在第一个类的某个子类中稍后定义的另一个方法(通过打开基类的闭包并让派生类进入,以便基类可以看到它,例如,在C++中使其成为虚拟的)。请参阅关于此主题的一篇写得很好的文章。来自他最近的另一篇推文“我对OO的定义是消息传递与开放递归相结合”@letronje,你可能想看看我刚刚链接的那篇文章。开放递归更多的是后期绑定和继承带来的副作用,这就是为什么Daniel Spiewak可以说“OO是消息传递与开放递归结合的产物”,因为继承和子类型多态性是OOP的支柱之一。