Zamknięcia są bardzo lekko związane z zajęciami. Klasy umożliwiają definiowanie pól i metod, a zamknięcia zawierają informacje o zmiennych lokalnych z wywołania funkcji. Nie ma żadnego możliwego porównania tych dwóch w sposób agnostyczny językowo: nie służą one w ogóle temu celowi. Poza tym zamknięcia są dużo bardziej związane z programowaniem funkcjonalnym niż z programowaniem obiektowym.
Na przykład, spójrz na następujący kod C#:
static void Main(String[] args)
{
int i = 4;
var myDelegate = delegate()
{
i = 5;
}
Console.WriteLine(i);
myDelegate();
Console.WriteLine(i);
}
Daje to "4", a następnie "5". myDelegate
, będąc delegatem, jest zamknięciem i wie o wszystkich zmiennych aktualnie używanych przez funkcję. Dlatego też, gdy go nazywam, dozwolona jest zmiana wartości i
wewnątrz funkcji "nadrzędnej". Nie byłoby to dozwolone dla normalnej funkcji.
Klasy, jeśli wiesz, czym są, są zupełnie inne.
Możliwym powodem twojego zamieszania jest to, że gdy język nie ma obsługi języka dla zamknięć, można symulować je za pomocą klas, które będą zawierać każdą zmienną, którą musimy zachować. Na przykład, możemy przepisać powyższy kod tak:
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);
}
Mamy przekształcił delegate
do klasy, że mamy o nazwie MainClosure
. Zamiast tworzyć zmienną i
wewnątrz funkcji , utworzyliśmy obiekt MainClosure
, który ma pole i
. To ta, której użyjemy. Zbudowaliśmy również kod funkcji wykonywany wewnątrz metody instancji, zamiast wewnątrz metody.
Jak widać, mimo że był to łatwy przykład (tylko jedna zmienna), jest to znacznie więcej pracy. W kontekście, w którym chcesz zamknąć, używanie obiektów jest złym rozwiązaniem. Klasy są jednak użyteczne nie tylko do tworzenia zamknięć, a ich zwykły cel jest zwykle inny.
Udzielanie odpowiedzi w sposób nieobowiązujący język jest bardzo, bardzo trudne, ponieważ najwygodniejszy z nich jest prawie koniecznie określony przez język, którego używasz. – zneak