एक परिदृश्य पर विचार करें जहां हम उपयोगकर्ता नामक एक वर्ग बनाते हैं और फिर एक उपवर्ग बनाते हैं जो उपयोगकर्ता को विस्तारित करता है जिसे कर्मचारी कहा जाता है।
आमतौर पर, हम उपयोगकर्ता का एक उदाहरण बनाते हैं:
के साथ
User user = new User();
यहाँ उपयोगकर्ता वेरिएबल उपयोगकर्ता का प्रकार है, उपयोगकर्ता वह वेरिएबल है जो क्लास का उदाहरण रखता है, और नया उपयोगकर्ता() उपयोगकर्ता का एक नया उदाहरण बनाता है।
सीधे शब्दों में कहें तो उपयोगकर्ता, उपयोगकर्ता का एक उदाहरण है।
लेकिन क्या होगा यदि सुपरक्लास उपयोगकर्ता को इसके उपवर्ग कर्मचारी में परिभाषित तरीकों का उपयोग करने की आवश्यकता हो? ऐसा कभी होता है क्या?
संक्षिप्त उत्तर है हां, लेकिन केवल ओवरराइड तरीकों के लिए (ऐसी विधियां जो सुपरक्लास और सबक्लास दोनों में मौजूद हैं)। यही बहुरूपता को सक्षम बनाता है।
चूंकि विरासत में संबंध "is-a" संबंध है, कर्मचारी एक उपयोगकर्ता है। इसलिए, उपयोगकर्ता को इसके उपवर्ग कर्मचारी के उदाहरण का संदर्भ रखने से कोई नहीं रोकता, जब तक कि यह एक संगत प्रकार है।
यह अग्रानुसार होगा:
User user = new Employee();
अब, मान लें कि उपयोगकर्ता वर्ग में दो विधियां हैं:
जबकि कर्मचारी वर्ग में getEmployeeInformation() नामक एक अतिरिक्त विधि है और getUserSalary() विधि को ओवरराइड करता है।
फिर उपयोगकर्ता उपयोगकर्ता के साथ = नया कर्मचारी();:
user.getUserName() काम करेगा, जैसा कि User वर्ग में परिभाषित है।
user.getUserSalary() भी काम करेगा, लेकिन आउटपुट कर्मचारी वर्ग में ओवरराइड getUserSalary() विधि से होगा, न कि User में से एक से। . यह बहुरूपता का सार है।
user.getEmployeeInformation() काम नहीं करेगा। यह एक संकलन त्रुटि देगा क्योंकि यह कर्मचारी वर्ग के लिए विशिष्ट है।
एक संकलन त्रुटि तब होती है जब कंपाइलर को सिंटैक्स त्रुटियां, प्रकार बेमेल, या अन्य उल्लंघन जैसे मुद्दे मिलते हैं जो सफल कोड संकलन को रोकते हैं।
यदि हम इसके विपरीत करने का प्रयास करते हैं और एक उपवर्ग ऑब्जेक्ट कर्मचारी को सुपरक्लास संदर्भ उपयोगकर्ता के साथ संदर्भित करते हैं, तो यह मैन्युअल कास्टिंग के बिना काम नहीं करेगा! इसके लिए स्पष्ट कास्टिंग की आवश्यकता है, क्योंकि उपयोगकर्ता आवश्यक रूप से एक कर्मचारी नहीं है।
इसे एक सरल उदाहरण के साथ, सरल तरीके से समझाने के बाद, आइए शर्तों पर ध्यान केंद्रित करें।
"उपवर्ग ऑब्जेक्ट का सुपरक्लास संदर्भ" को आम तौर पर अपकास्टिंग कहा जाता है। सीधे शब्दों में कहें तो, अपकास्टिंग एक चाइल्ड ऑब्जेक्ट को पैरेंट ऑब्जेक्ट में टाइपकास्ट करना है, और यह निहित रूप से होता है (मतलब कंपाइलर इसे स्वचालित रूप से संभालता है, इसलिए हमें किसी विशिष्ट कास्टिंग सिंटैक्स की आवश्यकता नहीं है)। यह वैसा ही है जब हमने User user = new Employee(); किया था।
डाउनकास्टिंग के बारे में क्या?
डाउनकास्टिंग अपकास्टिंग के बिल्कुल विपरीत है।
याद रखें जब हमने कहा था कि उपयोगकर्ता उदाहरण से कर्मचारी संदर्भ बनाना अमान्य है? इसे डाउनकास्टिंग कहा जाता है, और इसे स्पष्ट रूप से कास्टिंग सिंटैक्स का उपयोग करके किया जाना चाहिए। जबकि अपकास्टिंग बहुत सुरक्षित है, डाउनकास्टिंग जोखिम का कारण बनता है। इसका मतलब यह नहीं है कि यह उपयोगी नहीं है, लेकिन इसका उपयोग सावधानी के साथ किया जाना चाहिए।
मैं डाउनकास्टिंग के बारे में बहुत अधिक विस्तार में नहीं जाऊंगा क्योंकि यह लेख अपकास्टिंग पर केंद्रित है, लेकिन मुख्य बिंदु डाउनकास्टिंग और अपकास्टिंग के बीच मुख्य अंतर दिखा रहा है।
और वह एक कवर हैं! :)
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3