使用闭包和类的优缺点,以及两者之间的比较如何?
编辑:
正如用户Faisal所说,闭包和类都可以用于“描述维护和操作状态的实体”,因此使用闭包提供了一种使用函数式语言进行面向对象编程的方法。像大多数程序员一样,我更熟悉类。
本问题的目的不是要再次引发关于哪种编程范例更好,或者闭包和类是否完全等效,或是互相替代的争论。
我想知道的是是否有人发现其中一种方法在某种情况下真正超过了另一种方法,并且为什么。
使用闭包和类的优缺点,以及两者之间的比较如何?
编辑:
正如用户Faisal所说,闭包和类都可以用于“描述维护和操作状态的实体”,因此使用闭包提供了一种使用函数式语言进行面向对象编程的方法。像大多数程序员一样,我更熟悉类。
本问题的目的不是要再次引发关于哪种编程范例更好,或者闭包和类是否完全等效,或是互相替代的争论。
我想知道的是是否有人发现其中一种方法在某种情况下真正超过了另一种方法,并且为什么。
从功能上讲,闭包和对象是等效的。闭包可以模拟对象,反之亦然。因此,你使用哪个取决于语法方便性或者你所使用的编程语言最好处理哪个。
在C++中,闭包在语法上不可用,因此你必须使用“函数对象”,这些对象重载了operator()
,并且可以以看起来像函数调用的方式进行调用。
在Java中,甚至没有函数对象,因此你会得到像访问者模式这样的东西,在支持闭包的语言中,它只是一个高阶函数。
在标准Scheme中,你没有对象,因此有时你需要通过编写带有分发函数的闭包来实现它们,根据传入的参数执行不同的子闭包。
在像Python这样既有函数对象又有闭包语法的语言中,基本上是一种口味和你感觉哪种更好地表达了你正在做的事情。
个人而言,在任何同时具有两者语法的语言中,闭包都是表达具有单个方法的对象更清晰、更简洁的方式。反之,如果你的闭包开始根据传入的参数处理分发到子闭包,那么你应该使用对象。
static void Main(String[] args)
{
int i = 4;
var myDelegate = delegate()
{
i = 5;
}
Console.WriteLine(i);
myDelegate();
Console.WriteLine(i);
}
这将返回"4"然后是"5"。myDelegate
作为一个代理,是一个闭包并且知道函数当前使用的所有变量。因此,当我调用它时,它可以更改“父”函数内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);
}
delegate
转换为一个名为MainClosure
的类。我们没有在Main
函数内部创建变量i
,而是创建了一个MainClosure
对象,该对象具有i
字段。这是我们将使用的字段。此外,我们已经将函数执行的代码构建到实例方法中,而不是方法内部。