Inheritance for code Reusability
इन्हेरिटेंस: कोड के पुनर्प्रयोग का माध्यम
C शार्प प्रोग्रामिंग लैंग्वेज ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की अवधारणा को अच्छी तरह क्रियान्वित करता है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज के अंतर्गत चार प्रमुख स्तंभ हैं जिनको ऐब्सट्रेक्शन, पॉलीमोरफ़िज्म, इन्हेरिटेंस और इनकैप्सूलेशन के नाम से जाना जाता है।
इस अनुच्छेद में हम ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के इन्हेरिटेंस कंसेप्ट को C शार्प प्रोग्रामिंग लैंग्वेज के द्वारा समझने की कोशिश करेंगे।
इनहेरिटेंस क्या होता है? इन्हेरिटेंस का शाब्दिक अर्थ होता है उत्तराधिकार ग्रहण करना, पैतृक संपत्ति को ग्रहण करना। कंप्यूटर प्रोग्रामिंग के अनुसार इन्हेरिटेंस से तात्पर्य एक क्लास द्वारा दूसरे क्लास के मेंबर्स को ग्रहण करने से है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, जब एक क्लास के कोड को दूसरा क्लास यूज करना है तो इसके लिए पहले क्लास के कोड को दूसरे क्लास में कॉपी किया जा सकता है लेकिन ऐसा करने पर कोड की साइज बढ़ जाएगी जबकि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की एक महत्वपूर्ण अवधारणा यह है कि कोड की रियुजबिलिटी होना चाहिए ना कि कोड को यत्र तत्र कॉपी किया जाए। दूसरे शब्दों में कोड की रियुजबिलिटी को बढ़ाने के लिए ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के अंतर्गत इन्हेरिटेंस की अवधारणा को विकसित किया गया है।
जब एक क्लास दूसरे क्लास को इन्हेरीट करता है तो ऐसी हालत में जो क्लास इन्हेरीट करता है उसे चाइल्ड क्लास कहते हैं और जिस क्लास को इन्हेरीट किया जाता है उसे पैरंट क्लास करते हैं।
समानार्थी शब्द: पैरंट क्लास को बेस क्लास या सुपर क्लास भी कहा जाता है। इसी तरह, चाइल्ड क्लास को sub क्लास या derived क्लास के रूप में भी व्यक्त किया जाता है। C शार्प प्रोग्रामिंग लैंग्वेज में base क्लास और derived क्लास शब्दों का मुख्य रूप से प्रयोग किया जाता है जबकि जावा प्रोग्रामिंग लैंग्वेज में सुपर क्लास और चाइल्ड क्लास शब्दों का प्रयोग किया जाता है।
पैरंट चाइल्ड रिलेशनशिप को व्यक्त करने के लिए C शार्प प्रोग्रामिंग लैंग्वेज के अंतर्गत कोलन सिंबल का प्रयोग किया जाता है उदाहरण के लिए B : A का अभिप्राय यह है कि बी क्लास ए क्लास को इन्हेरीट किया है अर्थात B क्लास ने A क्लास के मेंबर्स को अपने भीतर समाहित कर लिया है। अतः B क्लास A क्लास के मेंबर्स को कंज्यूम कर सकता है। जब B क्लास A क्लास को इन्हेरीट करता है तो वह A क्लास के सारे मेंबर्स को यूज़ कर सकता है सिवाय A क्लास के प्राइवेट मेंबर को छोड़कर।
class A
{
// Members of A
}
class B : A
{
// Members of A and B except private members of A
}
यह आम जीवन से बिल्कुल मिलता जुलता प्रसंग या मेटाफर या रूपक है जैसे पुत्र अपने पिता के सारी संपत्ति का उत्तराधिकारी होता है सिवाय पिता के प्राइवेट संपत्ति जैसे उसकी योग्यता, जॉब इत्यादि को छोड़कर। अतः ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज के अंतर्गत इनहेरिटेंस के कंसेप्ट को पैरंट चाइल्ड रिलेशनशिप में व्यक्त किया जाता है।
जिस तरह पुत्र का जीवन चक्र पिता के जीवन चक्र पर आधारित होता है, बिना पिता के जीवन के पुत्र का जीवन का उदय नहीं हो सकता ठीक उसी तरह चाइल्ड क्लास का जीवन चक्र अपने बेस या पैरेंट क्लास के जीवन चक्र पर आधारित है। इसे ऐसे समझे कि चाइल्ड क्लास का ऑब्जेक्ट बनाने पर पहले बेस क्लास का कंस्ट्रक्टर कॉल होगा और उसके बाद उसके चाइल्ड क्लास का कंस्ट्रक्टर कॉल होगा। यह बात बिल्कुल लॉजिकल भी है क्योंकि चाइल्ड क्लास बेस क्लास के मेंबर्स को इन्हेरीट करता है अतः पहले बेस क्लास के ऑब्जेक्ट का क्रिएशन जरूरी है, दूसरे शब्दों में बेस क्लास के मेम्बर्स का इनिशियलाइज जरूरी है ताकि चाइल्ड क्लास बेस क्लास के मेंबर्स को इन्हेरीट कर सकें।
इन्हेरिटेंस की शर्तें
अब हम उन शर्तों को देखेंगे जिसके अंतर्गत कोई क्लास किसी दूसरे क्लास को इन्हेरीट कर सकता है अथवा नहीं कर सकता है। एक क्लास दूसरे क्लास को इन्हेरीट करें इसके लिए जरूरी है कि जिस क्लास कोई इन्हेरीट किया जा रहा है वह क्लास इन्हेरीटेबल हो अर्थात दूसरे क्लास के लिए एक्सेसिबल हो। अब प्रश्न उत्पन्न होता है कि इसके लिए क्या क्या शर्तें हैं।
एक क्लास जब दूसरे क्लास को इन्हेरीट करता है तो उसके लिए सबसे महत्वपूर्ण तत्व पैरंट क्लास का कंस्ट्रक्टर होता है जो निर्धारित करता है कि उस क्लास को इन्हेरीट किया जा सकता है अथवा नहीं और अगर इन्हेरीट किया जा सकता है तो उसके लिए क्या शर्ते होंगी। ऐसा इसलिए आवश्यक है क्योंकि जब भी चाइल्ड क्लास का ऑब्जेक्ट बनाया जाता है तो उसका कंस्ट्रक्टर कॉल होता है लेकिन उसके पहले बेस क्लास का कंस्ट्रक्टर कॉल होता है। दूसरे शब्दों में, चाइल्ड क्लास का कंस्ट्रक्टर बेस क्लास के कंस्ट्रक्टर को कॉल करता है। पेरेंट क्लास का कंस्ट्रक्टर कई प्रकार का संभव है जैसे इंपलीसिट कंस्ट्रक्टर, एक्सप्लिसिट कंस्ट्रक्टर। एक्सप्लिसिट कंस्ट्रक्टर के भी कई अलग-अलग प्रकार है जैसे पैरामीटरयुक्त कंस्ट्रक्टर और पैरामीटररहित कंस्ट्रक्टर।
इंपलीसिट कंस्ट्रक्टर सदैव पब्लिक होता है। अगर पैरेंट क्लास का कंस्ट्रक्टर इंपलीसिट कंस्ट्रक्टर हो तो उसको कोई भी दूसरा क्लास इन्हेरीट कर सकता है क्योंकि तब चाइल्ड क्लास का कंस्ट्रक्टर बेस क्लास के कंस्ट्रक्टर को कॉल कर सकता है। उदाहरण के लिए निम्नलिखित कोड को देखें।
नियम १) एक क्लास दूसरे क्लास को तभी इन्हेरीट कर सकता है जब पहला क्लास का कंस्ट्रक्टर दूसरे क्लास के कंस्ट्रक्टर को कॉल कर सकें।
नियम २) इन्हेरिटेंस के अंतर्गत यह बात याद रखने वाली है की चाइल्ड क्लास बेस क्लास के मेंबर को कंज्यूम कर सकता है परंतु बेस क्लास चाइल्ड क्लास के मेंबर्स को यूज नहीं कर सकता है अर्थात यह संबंध एक तरफा है।
नियम ३) इन्हेरिटेंस के अंतर्गत यह बात याद रखने वाली है कि चाइल्ड क्लास की सहायता से बेस क्लास के मेंबर फ़ील्ड्स को इनिशियलाइज किया जा सकता है परन्तु इसके विपरीत दिशा में सत्य नहीं है। p=c दूसरे शब्दों में, पैरेंट क्लास के रेफेरेंस वेरिएबल को चाइल्ड क्लास का रेफेरेंस दिया जा सकता है।
नियम ४) इन्हेरिटेंस के अंतर्गत यह बात स्मरणीय है कि यदि कोई क्लास प्रत्यक्ष रूप में किसी क्लास को इन्हेरिट नहीं कर रहा हूं तो ऐसी हालत में वह क्लास Object क्लास को इन्हेरिट करता है। दूसरे शब्दों में, Object क्लास प्रत्येक क्लास का टॉपमोस्ट सुपर क्लास होता है। अतः Object क्लास के मेथड मेम्बर्स जैसे Equals, GetHashCode, GetType, ToString मेथड्स सभी क्लासेज द्वारा इन्हेरिट किया जाता है।
नियम ५)ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज के अंतर्गत इन्हेरिटेंस दो प्रकार का होता है-
I) Single Inheritance
II)Multiple Inheritance
यह बात ध्यातव्य है कि C# लैंग्वेज Multiple Inheritance को सपोर्ट नहीं करता है। C# लैंगुएज Single Inheritance को सपोर्ट करता है। Single Inheritance के विभिन्न स्वरूप हैं जो इस प्रकार है
Single level Inheritance
Multi level Inheritance
Hierarchical Inheritance
इन्हेरिटेंस के अंतर्गत एक क्लास को दूसरा क्लास इन्हेरीट करता है और इसी तरह दूसरे क्लास को तीसरा क्लास में इन्हेरीट कर सकता है। फिर तीसरे क्लास को दो या अधिक क्लासेज इन्हेरिट कर सकते हैं। इस प्रकार विभिन्न क्लासेज के बीच इन्हेरिटेंस की एक लंबी श्रृंखला हो सकती है।
Single Inheritance जब एक क्लास का एक और केवल एक ही पैरंट क्लास या बेस क्लास हो तो इस प्रकार के इन्हेरिटेंस या क्लासेज के बीच के संबंध को सिंगल इन्हेरिटेंस कहते हैं।
Multiple Inheritance जब एक क्लास का एक से अधिक पैरंट क्लास या बेस क्लास हो तो इस प्रकार के इन्हेरिटेंस या क्लासेज के बीच के संबंध को Multiple इन्हेरिटेंस कहते हैं।
Single level Single Inheritance जब एक क्लास का एक और केवल एक ही पैरंट या बेस क्लास हो, और पैरेंट क्लास का एक और केवल एक ही चाइल्ड क्लास हो और यह सम्बंध केवल एक स्तर का होतो इस प्रकार के इन्हेरिटेंस या क्लासेज के बीच के संबंध को एकस्तरीय सिंगल इन्हेरिटेंस कहते हैं।
Multilevel Single Inheritance जब एक क्लास का एक और केवल एक ही पैरंट या बेस क्लास हो, और पैरेंट क्लास का एक और केवल एक ही चाइल्ड क्लास हो तो और यह सम्बंध केवल एक से अधिक स्तर का होतो इस प्रकार के इन्हेरिटेंस या क्लासेज के बीच के संबंध को मल्टी स्तर सिंगल इन्हेरिटेंस कहते हैं।
Hierarchical Single Inheritance जब एक क्लास का एक और केवल एक ही पैरंट या बेस क्लास हो, और पैरेंट क्लास का एक से अधिक चाइल्ड क्लास हो तो इस प्रकार के इन्हेरिटेंस या क्लासेज के बीच के संबंध को सिंगल श्रेणीबद्ध इन्हेरिटेंस कहते हैं।
किसी क्लास में एक्सप्लिसिट कंस्ट्रक्टर यदि पैरामीटररहित कंस्ट्रक्टर हो और प्राइवेट नहीं हो तो उस क्लास को इन्हेरिट किया जा सकता है क्योंकि तब
चाइल्ड क्लास का कंस्ट्रक्टर बेस क्लास के कंस्ट्रक्टर को कॉल कर सकता है।
नियम ६) किसी क्लास में एक्सप्लिसिट कंस्ट्रक्टर यदि पैरामीटरयुक्त कंस्ट्रक्टर हो और प्राइवेट नहीं हो तो उस क्लास को इन्हेरिट किया जा सकता है। लेकिन ऐसी स्थिति में चाइल्ड क्लास का कंस्ट्रक्टर बेस क्लास के कंस्ट्रक्टर को कॉल करता है तब उसे साथ ही बेस क्लास के कंस्ट्रक्टर को पैरामीटर भी पास करना होता है। ऐसे पैरामीटर की वैल्यू को पास करना प्रोग्रामर की रिस्पांसिबिलिटी है। जब पैरंट क्लास का कंस्ट्रक्टर पैरामीटराइज्ड होता है तो चाइल्ड क्लास का कंस्ट्रक्टर उसको इंपलीसिटली अप्रत्यक्ष रूप से कॉल नहीं कर सकता है और तब पैरामीटर की वैल्यू को पास करना प्रोग्रामर की जिम्मेदारी है।
इन्हेरिटेंस का व्यावहारिक उदाहरण: हॉस्पिटल सिस्टम के अंतर्गत डॉक्टर, मरीज और नर्स entities की सहायता से इन्हेरिटेंस को समझेंगे। डाटाबेस तकनीक के अंतर्गत जिसे एंटिटी कहते हैं उसको ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज के अंतर्गत क्लास कहा जाता है। एंटिटी के एटट्रिब्यूट को क्लास के भीतर फील्ड कहा जाता है। जिस तरह एंटिटी के बीच में सम्बन्ध होता है ठीक उसी तरह क्लासेस के बीच में भी सम्बंध हो सकता है जिसको ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज में इन्हेरीटेंस के नाम से जाना जाता है।
लेखक अजीत कुमार १६ अक्टूबर २०२१ दशहरा के अगले दिन शनिवार को प्रथम बार प्रकाशित और सम्पादित
😊अनुवाद-
एक्सप्लिसिट कंस्ट्रक्टर और इमप्लिसिट कंस्ट्रक्टर का अनुवाद क्रमशः व्यक्त रचनाकार और अव्यक्त रचनाकार कर सकते हैं। पैरामीटर का अनुवाद प्राचल होता है।
© अजीत कुमार, सर्वाधिकार सुरक्षित।
इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।
No comments:
Post a Comment