डाउनकास्टिंग

कक्षा-आधारित प्रोग्रामिंग में, डाउनकास्टिंग या टाइप रिफ़ाइनमेंट, बेस क्लास के संदर्भ को उसके व्युत्पन्न वर्गों में से एक में परिवर्तित करने का कार्य है।

कई प्रोग्रामिंग भाषाओं में, यह निर्धारित करने के लिए प्रकार के आत्मनिरीक्षण के माध्यम से जांच करना संभव है कि क्या संदर्भित ऑब्जेक्ट का प्रकार वास्तव में डाला जा रहा है या उसका व्युत्पन्न प्रकार है, और इस प्रकार यदि ऐसा नहीं है तो एक त्रुटि जारी होती है।

दूसरे शब्दों में, जब आधार वर्ग (मूल वर्ग#उपवर्ग और सुपरवर्ग) के एक चर में व्युत्पन्न वर्ग (उपवर्ग (कंप्यूटर विज्ञान)) का मान होता है, तो डाउनकास्टिंग संभव है।

कुछ भाषाएँ, जैसे OCaml, डाउनकास्टिंग की अनुमति नहीं देती हैं।

सी++
 // मूल वर्ग: वर्ग फल { जनता: // रनटाइम-चेक किए गए डायनेमिक-कास्ट का उपयोग करने के लिए बहुरूपी होना चाहिए। आभासी ~फल = डिफ़ॉल्ट; };

// बाल वर्ग: वर्ग सेब : सार्वजनिक फल {};

int मुख्य(int argc, const char** argv) { // निम्नलिखित एक अंतर्निहित अपकास्ट है: फल* मूल = नया सेब; // निम्नलिखित एक डाउनकास्ट है। यहां, यह तब से काम करता है जब वेरिएबल `पैरेंट` है // Apple का एक उदाहरण रखें: Apple* बच्चा = डायनामिक_कास्ट(अभिभावक); } 

उपयोग
डाउनकास्टिंग तब उपयोगी होती है जब पैरेंट वेरिएबल द्वारा संदर्भित मान का प्रकार ज्ञात होता है और अक्सर किसी मान को पैरामीटर के रूप में पास करते समय इसका उपयोग किया जाता है। नीचे दिए गए उदाहरण में, विधि objectToString एक ऑब्जेक्ट पैरामीटर लेती है जिसे स्ट्रिंग प्रकार का माना जाता है। इस दृष्टिकोण में, डाउनकास्टिंग कंपाइलर को संभावित त्रुटि का पता लगाने से रोकता है और इसके बजाय रन-टाइम त्रुटि का कारण बनता है। संकलन समय पर myObject को स्ट्रिंग ('(स्ट्रिंग)myObject') में डाउनकास्ट करना संभव नहीं था क्योंकि कई बार myObject स्ट्रिंग प्रकार होता है, इसलिए केवल रन टाइम पर ही हम यह पता लगा सकते हैं कि पारित पैरामीटर तार्किक है या नहीं। जबकि हम यूनिवर्सल java.lang.Object.toString का उपयोग करके myObject को एक संकलन-समय स्ट्रिंग में परिवर्तित कर सकते हैं, इससे toString के डिफ़ॉल्ट कार्यान्वयन को कॉल करने का जोखिम होगा जहां यह अनुपयोगी या असुरक्षित था, और अपवाद हैंडलिंग इसे रोक नहीं सकती थी.

C++ में, रन-टाइम प्रकार की जाँच डायनामिक_कास्ट के माध्यम से कार्यान्वित की जाती है। कंपाइल-टाइम डाउनकास्टिंग को static_cast द्वारा कार्यान्वित किया जाता है, लेकिन यह ऑपरेशन किसी प्रकार की जांच नहीं करता है। यदि इसका उपयोग अनुचित तरीके से किया जाता है, तो यह अपरिभाषित व्यवहार उत्पन्न कर सकता है।

विचार
खराब समझे जाने वाले डिज़ाइन का एक लोकप्रिय उदाहरण शीर्ष प्रकार के कंटेनर हैं, जावा जेनेरिक पेश किए जाने से पहले जावा (प्रोग्रामिंग भाषा) कंटेनरों की तरह, जिसमें निहित वस्तुओं को डाउनकास्ट करने की आवश्यकता होती है ताकि उन्हें फिर से उपयोग किया जा सके।

यह भी देखें

 * उपप्रकार बहुरूपता

बाहरी संबंध

 * Downcasting is a Code Smell by Jeremy D. Miller
 * A downcasting tragedy by Jimmy Bogard
 * Prefer polymorphism over instanceof and downcasting by Bill Venners
 * Downcasting in C# by Scott Lysle
 * Multiple downcasting techniques
 * Upcasting, downcasting by Sinipull