परिचय: बेस क्लास का कंस्ट्रक्टर सिर्फ "उबाऊ थ्योरी" क्यों नहीं है?
\n\nकल्पना करें कि आप एक घर बना रहे हैं। आपके पास नींव (बेस क्लास) और घर (डिराइव्ड क्लास) है। नींव पहले से रखी गई है, लेकिन घर को मजबूती से खड़ा करने के लिए, इसे नींव से सही ढंग से "जोड़ना" होगा। C# में यह "जोड़" base कीवर्ड के माध्यम से बेस क्लास के कंस्ट्रक्टर को कॉल करके किया जाता है।
यह उन विषयों में से एक है जो Stack Overflow पर हज़ारों प्रश्न उत्पन्न करता है। क्यों? क्योंकि इस तंत्र को समझे बिना, आपका कोड या तो कंपाइल नहीं होगा, या अप्रत्याशित रूप से काम करेगा। इस लेख में हम C# में बेस क्लास के कंस्ट्रक्टर को कॉल करना सरल से जटिल तक समझेंगे: उदाहरणों, छिपी समस्याओं और वास्तविक परिदृश्यों के साथ।
\n\nआप इस लेख से क्या सीखेंगे?
\n- \n
- C# में कंस्ट्रक्टर इनहेरिटेंस कैसे काम करता है। \n
- कब और क्यों
base()को स्पष्ट रूप से कॉल करना आवश्यक है। \n - बेस क्लास के कंस्ट्रक्टर में पैरामीटर कैसे पास करें। \n
- सामान्य गलतियाँ और उनसे बचने के तरीके। \n
- उन्नत तकनीकें: कंस्ट्रक्टर चेन और ओवरलोडिंग। \n
1. मूल बातें: बेस क्लास का कंस्ट्रक्टर क्या है?
\n\nC# में, प्रत्येक क्लास में एक या अधिक कंस्ट्रक्टर हो सकते हैं। जब आप डिराइव्ड क्लास का इंस्टेंस बनाते हैं, तो सबसे पहले बेस क्लास का कंस्ट्रक्टर कॉल किया जाता है। यह सुनिश्चित करता है कि "पैरेंट" के सभी फील्ड और प्रॉपर्टीज़ इनिशियलाइज़ हो जाएँ, इससे पहले कि "चाइल्ड" काम करना शुरू करे।
\n\nयदि आप स्पष्ट रूप से यह नहीं बताते कि बेस क्लास का कौन सा कंस्ट्रक्टर कॉल करना है, तो कंपाइलर डिफ़ॉल्ट कंस्ट्रक्टर (बिना पैरामीटर के) को कॉल करने का प्रयास करेगा। यदि वह मौजूद नहीं है, तो आपको कंपाइलेशन एरर मिलेगी।
\n\nउदाहरण 1: अंतर्निहित कॉल (बहुत सरल)
\npublic class Animal\n{\n public string Name { get; set; }\n\n public Animal()\n {\n Name = "अज्ञात जानवर";\n Console.WriteLine("Animal: बिना पैरामीटर का कंस्ट्रक्टर");\n }\n}\n\npublic class Dog : Animal\n{\n public Dog()\n {\n Console.WriteLine("Dog: कंस्ट्रक्टर");\n }\n}\n\n// उपयोग\nDog dog = new Dog();\n// आउटपुट:\n// Animal: बिना पैरामीटर का कंस्ट्रक्टर\n// Dog: कंस्ट्रक्टर\n\nयहाँ Dog अंतर्निहित रूप से Animal() को कॉल करता है। सब कुछ काम करता है, क्योंकि Animal में डिफ़ॉल्ट कंस्ट्रक्टर है।
2. समस्या: जब डिफ़ॉल्ट कंस्ट्रक्टर मौजूद न हो
\n\nअब कल्पना करें कि बेस क्लास को अनिवार्य पैरामीटर की आवश्यकता है। उदाहरण के लिए, एक जानवर का नाम होना चाहिए। यदि बिना पैरामीटर वाला कंस्ट्रक्टर हटा दिया जाए, तो कोड कंपाइल नहीं होगा।
\n\nउदाहरण 2: कंपाइलेशन एरर
\npublic class Animal\n{\n public string Name { get; }\n\n public Animal(string name) // एकमात्र कंस्ट्रक्टर\n {\n Name = name;\n }\n}\n\npublic class Dog : Animal\n{\n // एरर CS7036: "Animal" में कोई कंस्ट्रक्टर नहीं है जो 0 आर्गुमेंट लेता हो\n public Dog() \n {\n }\n}\n\nकंपाइलर चिल्लाता है: "अरे, मुझे नहीं पता कि बिना नाम के Animal को कैसे इनिशियलाइज़ करूँ!"। समाधान — base का उपयोग करके बेस क्लास के कंस्ट्रक्टर को स्पष्ट रूप से कॉल करना।
3. कीवर्ड base: कंस्ट्रक्टर का स्पष्ट कॉल
\n\nC# में कीवर्ड base का उपयोग बेस क्लास के सदस्यों को संदर्भित करने के लिए किया जाता है। कंस्ट्रक्टर के संदर्भ में, यह निर्दिष्ट करने की अनुमति देता है कि पैरेंट का कौन सा कंस्ट्रक्टर और किन आर्गुमेंट्स के साथ कॉल किया जाना चाहिए।
सिंटैक्स:
\npublic class डिराइव्डक्लास : बेसक्लास\n{\n public डिराइव्डक्लास(पैरामीटर) : base(आर्गुमेंट्स)\n {\n // कंस्ट्रक्टर का बॉडी\n }\n}\n\nकोलन और base(आर्गुमेंट्स) कंस्ट्रक्टर की सिग्नेचर के तुरंत बाद, बॉडी से पहले लिखा जाता है।
उदाहरण 3: एरर को ठीक करना
\npublic class Animal\n{\n public string Name { get; }\n\n public Animal(string name)\n {\n Name = name;\n Console.WriteLine($"Animal: {name} बनाया गया");\n