क्लोजर कक्षाओं से बहुत हल्के से संबंधित हैं। कक्षाएं आपको फ़ील्ड और विधियों को परिभाषित करने देती हैं, और बंद करने से फ़ंक्शन कॉल से स्थानीय चर के बारे में जानकारी हो जाती है। भाषा-अज्ञेय तरीके से दोनों की कोई संभावित तुलना नहीं है: वे एक ही उद्देश्य की सेवा नहीं करते हैं। इसके अलावा, बंद ऑब्जेक्ट उन्मुख प्रोग्रामिंग की तुलना में कार्यात्मक प्रोग्रामिंग से अधिक संबंधित हैं।
उदाहरण के लिए निम्नलिखित सी # कोड को देखो:
static void Main(String[] args)
{
int i = 4;
var myDelegate = delegate()
{
i = 5;
}
Console.WriteLine(i);
myDelegate();
Console.WriteLine(i);
}
इससे "4" तो "5"। myDelegate
, एक प्रतिनिधि होने के नाते, एक बंद है और वर्तमान में फ़ंक्शन द्वारा उपयोग किए जाने वाले सभी चर के बारे में जानता है। इसलिए, जब मैं इसे कॉल करता हूं, तो इसे के मान को "पैरेंट" फ़ंक्शन के अंदर बदलने की अनुमति है। सामान्य कार्य के लिए इसकी अनुमति नहीं दी जाएगी।
कक्षाएं, यदि आप जानते हैं कि वे क्या हैं, तो पूरी तरह से अलग हैं।
आपके भ्रम का एक संभावित कारण यह है कि जब किसी भाषा के पास बंद होने के लिए कोई भाषा समर्थन नहीं होता है, तो उन वर्गों का उपयोग करके उन्हें अनुकरण करना संभव है जो हर चर को पकड़ने के लिए आवश्यक हैं। उदाहरण के लिए, हम इस तरह उपरोक्त कोड को फिर से लिखने सकता है:
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
बुलाया गया है करने के लिए delegate
तब्दील कर दिया है। Main
फ़ंक्शन के अंदर परिवर्तनीय i
बनाने के बजाय, हमने MainClosure
ऑब्जेक्ट बनाया है, जिसमें i
फ़ील्ड है। यह वह है जिसे हम उपयोग करेंगे। साथ ही, हमने विधि को अंदरूनी विधि के अंदर फ़ंक्शन निष्पादित किया है, विधि के अंदर।
जैसा कि आप देख सकते हैं, भले ही यह एक आसान उदाहरण था (केवल एक चर), यह काफी अधिक काम है। एक संदर्भ में जहां आप बंद करना चाहते हैं, वस्तुओं का उपयोग करना एक खराब समाधान है। हालांकि, कक्षाएं न केवल बंद करने के लिए उपयोगी हैं, और उनका सामान्य उद्देश्य आमतौर पर बहुत अलग है।
एक भाषा-नास्तिक तरीके से इस का उत्तर देना, बहुत, बहुत कठिन है। – zneak