Constructor and its types
कंस्ट्रक्टर क्या है? C# प्रोग्रामिंग लैंग्वेज एक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज है जिसके अंतर्गत ऑब्जेक्ट एक मूलभूत प्रोग्रामिंग इकाई है। जब किसी ऑब्जेक्ट को क्रिएट करना होता है तो उसके लिए एक टेंपलेट की आवश्यकता होती है जिसे ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की भाषा में क्लास कहते हैं। क्लास के अंतर्गत 2 हिस्से होते हैं। एक हिस्सा ऑब्जेक्ट के डाटा को रिप्रेजेंट करने के लिए फ़ील्ड्स के रूप में होता है जबकि उस डाटा पर वर्क करने के लिए क्लास के अंतर्गत मेथड होते हैं। क्लास की behaviour या आचरण को क्लास का मेथड रेखांकित करता है।
जब किसी क्लास का ऑब्जेक्ट बनाया जाता है तो उसके लिए C# प्रोग्रामिंग लैंग्वेज के अंतर्गत new ऑपरेटर का उपयोग किया जाता है। साथ ही, ऑब्जेक्ट को बनाने के दौरान उस ऑब्जेक्ट से संबंधित क्लास के फ़ील्ड्स का इनिशियलाइजेशन होता है। इनिशियलाइजेशन से अभिप्राय क्लास के फ़ील्ड्स को उनका आरम्भिक मूल्य देने से है। कंस्ट्रक्टर एक ऐसी युक्ति है जिसकी सहायता से क्लास के फील्ड्स का इनिशियलाइजेशन किया जाता है। कंस्ट्रक्टर का शाब्दिक अर्थ है कंस्ट्रक्ट करना, रचना करना। कंस्ट्रक्टर किसी ऑब्जेक्ट की रचना करने में सहायक होता है। बिना फ़ील्ड्स को इनिशियल वैल्यू दिए किसी ऑब्जेक्ट को क्रिएट नहीं किया जा सकता है। कंस्ट्रक्टर किसी क्लास के फ़ील्ड्स को इनिशियल वैल्यू देकर ऑब्जेक्ट को क्रिएट करने में मदद करता है।
कंस्ट्रक्टर किसी भी क्लास का एक खास प्रकार का मेथड होता है जो क्लास के फ़ील्ड्स को इनिशियलाइज करता है लेकिन यह कुछ भी रिटर्न नहीं करता है। इसका मुख्य उद्देश्य तो बस क्लास के फ़ील्ड्स को इनिशियलाइज करना ही होता है। अतः कंस्ट्रक्टर कुछ भी रिटर्न नहीं करता है।
कंस्ट्रक्टर का नाम सदैव क्लास का नाम होता है और C# के अंतर्गत यह सदैव क्लास के भीतर ही डिफाइन किया जाता है। कंस्ट्रक्टर का स्कोप भी होता है जिसे modifier की सहायता से व्यक्त किया जाता है। यह हम आगे देखेंगे।
प्रत्येक क्लास का एक न एक कंस्ट्रक्टर अवश्य ही होता है। ऐसा इसलिए क्योंकि बिना फील्ड्स को इनिशियलाइज किए ऑब्जेक्ट को मेमोरी नहीं दिया जा सकता है। क्लास के अलग-अलग फील्ड्स के डाटा टाइप के अनुसार heap के भीतर किसी ऑब्जेक्ट की मेमोरी की साइज निर्धारित होती है। जब heap के भीतर कोई ऑब्जेक्ट मेमोरी ग्रहण करता है तो उस ऑब्जेक्ट के प्रत्येक फील्ड की इनिशियल वैल्यू भी निर्धारित होती है।
जो कंस्ट्रक्टर क्लास में दिखाई नहीं देता है उसे इंपलीसिट कंस्ट्रक्टर कहते हैं। ऐसा तब होता है जब क्लास में कोई भी कंस्ट्रक्टर प्रोग्रामर के द्वारा नहीं दिया जाता है। इंपलीसिट कंस्ट्रक्टर को डिफॉल्ट कंस्ट्रक्टर भी कहते हैं क्योंकि इंपलीसिट कंस्ट्रक्टर, क्लास के जितने भी फील्ड्स है, उनका इनिशियल वैल्यू उन फील्ड्स के डाटा टाइप के संगत डिफॉल्ट वैल्यू से करता है। उदाहरण के लिए अगर फील्ड int टाइप का हो तो डिफॉल्ट कंस्ट्रक्टर उस फील्ड का इनिशियल वैल्यू जीरो देगा। इसी प्रकार अगर फील्ड string टाइप का है तो फील्ड का इनिशियल वैल्यू डिफॉल्ट कंस्ट्रक्टर null वैल्यू देगा और अगर कोई फील्ड बुलियन टाइप का है तो डिफॉल्ट कंस्ट्रक्टर उसका डिफॉल्ट वैल्यू false देगा।
डिफॉल्ट कंस्ट्रक्टर हमेशा पब्लिक होता है।
डिफॉल्ट कंस्ट्रक्टर हमेशा पैरामीटरलेस होता है।
डिफॉल्ट कंस्ट्रक्टर क्लास के भीतर दिखाई नहीं देता है।
डिफॉल्ट कंस्ट्रक्टर को कंपाइलर एकसेक्यूट करता है जब new न्यू ऑपरेटर की सहायता से किसी ऑब्जेक्ट को बनाया जाता है।
यद्यपि डिफॉल्ट कंस्ट्रक्टर को कंपाइलर डिफाइन करता है तथापि उसका execution प्रोग्रामर को स्पष्टतः एक्सप्लीसिटली करना होता है। याद रखें कि किसी भी नॉन स्टेटिक कंस्ट्रक्टर को एक्सप्लीसिटली कॉल करना होता है। नन स्टेटिक कंस्ट्रक्टर को इंस्टेन्स कंस्ट्रक्टर भी कहते हैं। नन स्टेटिक कंस्ट्रक्टर और स्टेटिक कंस्ट्रक्टर के भेद को हम आगे समझेंगे।
जब किसी कंस्ट्रक्टर को प्रोग्रामर द्वारा डिफाइन किया जाता है तब उसे एक्सप्लिसिट कंस्ट्रक्टर कहते हैं। एक्सप्लिसिट कंस्ट्रक्टर पैरामीटरलेस कंस्ट्रक्टर हो सकता है अथवा पैरामीटरयुक्त कंस्ट्रक्टर भी हो सकता है।
जब कंस्ट्रक्टर एक्सप्लिसिट कंस्ट्रक्टर होता है तब कंस्ट्रक्टर क्लास के फील्ड को किसी उचित वैल्यू मूल्य से इनिशियलाइज कर सकता है। उचित वैल्यू से तात्पर्य फील्ड की डाटा टाइप के अनुरूप मूल्य से है। एक्सप्लिसिट कंस्ट्रक्टर की हालत में कोई जरूरत नहीं कि फील्ड को उनकी डिफॉल्ट वैल्यू से ही इनिशियलाइज करें।
एक्सप्लिसिट कंस्ट्रक्टर की सबसे बड़ी खूबी यह होती है कि ऐसे कंस्ट्रक्टर वाले अलग-अलग ऑब्जेक्ट्स के फ़ील्ड्स को अलग-अलग मान से इनिशियलाइज कर सकते हैं। इस तरह एक ही क्लास का अलग अलग ऑब्जेक्ट्स बनाना संभव हो जाता है। उदाहरण के लिए,
इंपलीसिट कंस्ट्रक्टर सदैव पब्लिक होता है लेकिन एक्सप्लिसिट कंस्ट्रक्टर के साथ ऐसा कुछ जरूरी नहीं है। एक्सप्लिसिट कंस्ट्रक्टर प्राइवेट कंस्ट्रक्टर भी हो सकता है। इसके अलावा कोई अन्य modifier भी एक्सप्लिसिट कंस्ट्रक्टर के लिए लागू होता है।
प्राइवेट कंस्ट्रक्टर के द्वारा क्लास के ऑब्जेक्ट को केवल उसी क्लास के भीतर बनाया जा सकता है जिस क्लास के भीतर प्राइवेट कंस्ट्रक्टर डिफाइन किया गया है। जब कोई दूसरा क्लास, उस क्लास के ऑब्जेक्ट को बनाना चाहे तो ऐसा संभव नहीं होगा। दूसरे शब्दों में, प्राइवेट कंस्ट्रक्टर वाले क्लास को कोई दूसरा क्लास कंज्यूम नहीं कर सकता है। इसके विपरीत, पब्लिक कंस्ट्रक्टर वाले क्लास को कोई भी दूसरा क्लास कंज्यूम कर सकता है।
प्रोटेक्टेड कंस्ट्रक्टर वाले क्लास को उस क्लास में कंज्यूम किया जा सकता है अथवा उस क्लास के जितने भी चाइल्ड क्लासेज है उन क्लासेज के द्वारा कंज्यूम किया जा सकता है।
पैरामीटरयुक्त कंस्ट्रक्टर की खुबी यह है कि जब यूजर इस क्लास का ऑब्जेक्ट बनाता है तो कोई भी युक्त मान फ़ील्ड्स को देकर ऑब्जेक्ट को क्रिएट कर सकता है। लेकिन अगर यूजर फ़ील्ड्स के मान को, पैरामीटर के गलत आर्गुमेंट दे अर्थात उचित डाटा टाइप का प्रयोग ना करें तो ऑब्जेक्ट नहीं बन सकता है।
अब तक के वर्णन से यह स्पष्ट हो गया है कि कंस्ट्रक्टर चाहे किसी भी प्रकार का हो, कंस्ट्रक्टर का कार्य किसी भी क्लास के डाटा को इनिशियल वैल्यू प्रदान करना होता है। प्रत्येक क्लास में इम्प्लीसिट अथवा एक्सपलिसिट प्रत्यक्ष कंस्ट्रक्टर होता ही है। आलंकारिक रूप से रचना है तो रचनाकार होना चाहिए। ठीक उसी तरह, ऑब्जेक्ट है तो कंस्ट्रक्टर होना ही चाहिए।
स्टैटिक कंस्ट्रक्टर और नॉनस्टेटिक कंस्ट्रक्टर में अंतर
१) किसी क्लास में स्टैटिक कंस्ट्रक्टर तभी होता है जब क्लास में कोई स्टैटिक फील्ड होता है। अगर क्लास में स्टैटिक फील्ड नहीं है तो उसमें स्टैटिक कंस्ट्रक्टर भी नहीं होगा। स्टैटिक कंस्ट्रक्टर क्लास के स्टेटिक फील्ड को इनिशियलाइज करने के लिए यूज होता है।
२) स्टैटिक कंस्ट्रक्टर को एक्सप्लीसिटली कॉल नहीं किया जाता है। स्टैटिक कंस्ट्रक्टर अपने आप ही क्लास के लाइफ साइकिल के शुरुआत में कॉल होता है। क्लास की लाइफ साइकिल से अभिप्राय क्लास के भीतर के अलग-अलग कोड ब्लॉक के रन होने से है। जब क्लास का एक्सएक्यूश होता है तो सबसे पहले उसका कंस्ट्रक्टर कॉल होता है और अगर उस क्लास के भीतर कोई स्टैटिक्स फील्ड है तो स्टैटिक कंस्ट्रक्टर अपने आप कॉल हो जाता है। यह बात याद रखें कि नन स्टैटिक कंस्ट्रक्टर हमेशा एक्सप्लिसिट कॉल किया जाता है जबकि स्टैटिक कंस्ट्रक्शन अपने आप ही इम्प्लीसिटली कॉल होता है।
३) स्टैटिक कंस्ट्रक्टर इंपलीसिटली या एक्सप्लीसिटली डिफाइन हो सकता है। जब स्टैटिक कंस्ट्रक्टर इंपलीसिटली डिफाइन होता है तब स्टैटिक फील्ड कंपाइलर के द्वारा उसके डिफॉल्ट वैल्यू से इनिशियलाइज होता है। इसके विपरीत,
जब स्टैटिक कंस्ट्रक्टर एक्सपलीसिटली डिफाइन होता है तब स्टैटिक फील्ड प्रोग्रामर के द्वारा किसी उचित वैल्यू से इनिशियलाइज होता है।
४) स्टैटिक कंस्ट्रक्टर सदैव पैरामीटर रहित होता है। इसके पीछे एक कारण यह है कि क्लास के लाइफ साइकिल के बिल्कुल शुरुआत में स्टैटिक कंस्ट्रक्टर कॉल किया जाता है और उस समय स्टैटिक कंस्ट्रक्टर को कोई पैरामीटर वैल्यू पास करना संभव नहीं है।
५) जैसा कि स्टैटिक कंस्ट्रक्टर पैरामीटर रहित होता है अतः स्टैटिक कंस्ट्रक्टर का ओवरलोडिंग करना संभव नहीं है क्योंकि ओवरलोडिंग के लिए किसी मेथड या कंस्ट्रक्टर का पैरामीटर युक्त होना जरूरी है।
६) स्टैटिक कंस्ट्रक्टर को हमेशा इम्प्लीसिटली कॉल किया जाता है जबकि इनस्टैटिक कंस्ट्रक्टर को सदैव एक्सप्लीसिटली कॉल किया जाता है।
७) यदि क्लास में स्टैटिक कंस्ट्रक्टर और ननस्टैटिक कंस्ट्रक्टर है तो स्टैटिक कंस्ट्रक्टर हमेशा इनस्टैटिक कंस्ट्रक्टर से पहले कॉल किया जाता है।
८) स्टैटिक कंस्ट्रक्टर क्लास के संपूर्ण जीवन चक्र में केवल एक बार कॉल किया जाता है जबकि ननस्टैटिक कंस्ट्रक्टर क्लास के जीवन चक्र में जितनी मर्जी उतनी बार कॉल किया जा सकता है। इसका कारण यह भी है स्टैटिक कंस्ट्रक्टर कंपाइलर के द्वारा कॉल होता है जबकि ननस्टैटिक कंस्ट्रक्टर प्रोग्रामर के द्वारा कॉल होता है।
९) स्टैटिक कंस्ट्रक्टर क्लास के संपूर्ण जीवन चक्र के आरम्भ में स्वतः कॉल होता है जबकि ननस्टैटिक कंस्ट्रक्टर क्लास के संपूर्ण जीवन चक्र में कभी भी कॉल किया जा सकता है।
१०) स्टैटिक कंस्ट्रक्टर द्वारा इनिशियलाइज किए गए फील्ड को क्लास के सभी ऑब्जेक्ट्स द्वारा शेयर किया जाता है। अभिप्राय यह है कि सभी ऑब्जेक्ट के लिए स्थैतिक फील्ड का मान समान होता है। याद कीजिए कि नन स्टेटिक फील्ड का मान अलग अलग ऑब्जेक्ट के लिए अलग अलग होता है।
कॉपी कंस्ट्रक्टर
कॉपी कंस्ट्रक्टर एक नन स्टेटिक पैरामीटरयुक्त कंस्ट्रक्टर है जिसके पैरामीटर में उसी कंस्ट्रक्टर क्लास के ऑब्जेक्ट को एक पैरामीटर के रूप में पास किया जाता है।
लेखक अजीत कुमार
प्रथम बार संशोधन अष्टमी रामनवमी दुर्गा पूजा के दिन १३ अक्टूबर २०२१
© अजीत कुमार, सर्वाधिकार सुरक्षित।
इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।
No comments:
Post a Comment