Language agnostic 什么';闭包和传统类之间的区别是什么?

Language agnostic 什么';闭包和传统类之间的区别是什么?,language-agnostic,oop,functional-programming,closures,Language Agnostic,Oop,Functional Programming,Closures,闭包和类以及类闭包的优缺点是什么 编辑: 正如用户Faisal所说,闭包和类都可以用来“描述维护和操纵状态的实体”,因此闭包提供了一种使用函数式语言以面向对象的方式编程的方法。和大多数程序员一样,我更熟悉类 这个问题的目的并不是为了引发另一场关于哪种编程范式更好的战争,或者闭包和类是否完全等价,或者穷人的编程范式之间的战争 我想知道的是,是否有人发现一种方法真的优于另一种方法,以及原因。闭包与类的关系很小。类允许您定义字段和方法,闭包包含函数调用中有关局部变量的信息。不可能以语言不可知的方式对两

闭包和类以及类闭包的优缺点是什么

编辑:
正如用户Faisal所说,闭包和类都可以用来“描述维护和操纵状态的实体”,因此闭包提供了一种使用函数式语言以面向对象的方式编程的方法。和大多数程序员一样,我更熟悉类

这个问题的目的并不是为了引发另一场关于哪种编程范式更好的战争,或者闭包和类是否完全等价,或者穷人的编程范式之间的战争


我想知道的是,是否有人发现一种方法真的优于另一种方法,以及原因。

闭包与类的关系很小。类允许您定义字段和方法,闭包包含函数调用中有关局部变量的信息。不可能以语言不可知的方式对两者进行比较:它们根本没有相同的用途。此外,闭包与函数式编程的关系要比与面向对象编程的关系大得多

例如,看看下面的C代码:

这将给出“4”,然后是“5”
myDelegate
,作为委托,是一个闭包,知道函数当前使用的所有变量。因此,当我调用它时,允许在“parent”函数中更改
I
的值。这对于正常功能是不允许的

课程,如果你知道它们是什么的话,是完全不同的

造成混淆的一个可能原因是,当一种语言不支持闭包时,可以使用包含我们需要保留的每个变量的类来模拟闭包。例如,我们可以像这样重写上面的代码:

class MainClosure()
{
    public int i;

    void Apply()
    {
        i = 5;
    }
}

static void Main(String[] args)
{
    MainClosure closure;
    closure.i = 4;

    Console.WriteLine(closure.i);
    closure.Apply();
    Console.WriteLine(closure.i);
}
我们已经将
委托
转换为一个类,我们称之为
MainClosure
。我们没有在
Main
函数中创建变量
i
,而是创建了一个
MainClosure
对象,该对象有一个
i
字段。这就是我们要用的。此外,我们还构建了函数在实例方法中执行的代码,而不是在方法中执行的代码


正如您所看到的,尽管这是一个简单的示例(只有一个变量),但要做的工作要多得多。在需要闭包的环境中,使用对象是一个糟糕的解决方案。然而,类不仅对创建闭包有用,而且它们通常的用途也大不相同。

从功能上讲,闭包和对象是等价的。闭包可以模拟对象,反之亦然。因此,您使用哪一个是语法方便的问题,或者您的编程语言最能处理哪一个

“C++”中的“P>”不是语法上可用的,因此你不得不使用“函子”,这是覆盖“代码>操作程序()/<代码>的对象,可以用看起来像函数调用的方式调用。” 在Java中,甚至没有函子,所以可以得到类似Visitor模式的东西,它只是支持闭包的语言中的一个高阶函数

在标准方案中,您没有对象,因此有时您通过编写带有分派函数的闭包来实现它们,并根据传入参数执行不同的子闭包

在Python这样的语言中,它的语法既有函子也有闭包,这基本上是一个品味的问题,你觉得这是表达你正在做的事情的更好的方式


就我个人而言,我想说的是,在任何既有语法又有语法的语言中,闭包都是用一个方法来表达对象的一种更加清晰和干净的方式。反之亦然,如果您的闭包开始根据传入参数处理对子闭包的分派,那么您可能应该使用对象来代替。

我个人认为,这是使用正确的工具来完成工作的问题……更具体地说,是正确传达您的意图的问题

如果您想显式地显示所有对象共享一个公共定义,并希望对此类对象进行强类型检查,那么您可能需要使用一个类。在本例中,不能在运行时更改类的结构的缺点实际上是一个优势,因为您确切地知道自己在处理什么

相反,如果您希望创建一个异构的“对象”集合(即,状态表示为在某些函数下关闭的变量,其中包含内部函数以操作该数据),那么最好创建一个闭包。在这种情况下,对于最终得到的对象的结构没有真正的保证,但是您可以在运行时完全按照自己的喜好灵活地定义它


实际上,谢谢你的提问;起初我的回答是下意识的“类和闭包是完全不同的!”态度,但通过一些研究,我意识到这个问题并不像我想的那么简单。

我也这么想,但显然,闭包或对象是否更具表现力存在相当多的争论。让我给你们一点讨论的味道:根据我的理解,你们可以通过闭包实现对象,你们可以通过对象模拟闭包。但是,对象通常不会自动捕获本地环境,因此您必须显式地初始化它们。。。但是@zneak是正确的:它们最终有两个不同的目的,想要两者都不是不合理的。@Faisal:我认为这场辩论是关于显式使用闭包还是创建类来模拟闭包,在这种情况下,“完全”闭包显然更方便。@Amadan,@zneak,闭包的基本属性是什么,使其成为对象的超集?@zneak:如果闭包作为一种语言构造可用,为什么要使用类来模拟闭包?不过,我同意你得出的结论是显而易见的以语言不可知的方式回答这个问题是非常非常困难的,因为
class MainClosure()
{
    public int i;

    void Apply()
    {
        i = 5;
    }
}

static void Main(String[] args)
{
    MainClosure closure;
    closure.i = 4;

    Console.WriteLine(closure.i);
    closure.Apply();
    Console.WriteLine(closure.i);
}