Закрытия очень легко связаны с классами.Классы позволяют вам определять поля и методы, а замыкания содержат информацию о локальных переменных из вызова функции.Невозможно сравнить их в не зависящей от языка манере: они вообще не служат одной и той же цели.Кроме того, замыкания гораздо больше связаны с функциональным программированием, чем с объектно-ориентированным программированием.
Например, посмотрите на следующий код C #:
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
.Вместо создания переменной i
внутри функции Main
мы создали объект MainClosure
с полем i
.Это тот, который мы будем использовать.Кроме того, мы создали код, который функция выполняет внутри метода экземпляра, а не внутри метода.
Как вы можете видеть, хотя это был простой пример (только одна переменная), он значительно большеРабота.В контексте, где вы хотите замыкания, использование объектов - плохое решение.Однако классы полезны не только для создания замыканий, а их обычное назначение обычно сильно отличается.