डाउनकास्टिंग: Difference between revisions

From Vigyanwiki
(Created page with "{{redirect|Downcast|for the app|Downcast (app)|for the coal mining term|Glossary of coal mining terminology}} {{more footnotes|date=August 2008}} कक्षा-आधा...")
 
No edit summary
Line 1: Line 1:
{{redirect|Downcast|for the app|Downcast (app)|for the coal mining term|Glossary of coal mining terminology}}
{{redirect|डाउनकास्ट |ऐप के लिए|डाउनकास्ट (ऐप)|कोल माइनिंग टर्म|Glossary of coal mining terminology}}
{{more footnotes|date=August 2008}}
[[कक्षा-आधारित प्रोग्रामिंग]] में, डाउनकास्टिंग या टाइप रिफ़ाइनमेंट, बेस क्लास के संदर्भ को उसके व्युत्पन्न वर्गों में से एक में परिवर्तित करने का कार्य है।


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


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


कुछ भाषाएँ, जैसे [[OCaml]], डाउनकास्टिंग की अनुमति नहीं देती हैं।<ref>{{Cite web | work =The OCaml system release 4.01 : Documentation and user's manual | title = OCaml में ऑब्जेक्ट| first1= Jérôme |last1=Vouillon |first2=Didier |last2=Rémy |first3=Jacques |last3=Garrigue| date = September 12, 2013 | accessdate =  | url = http://caml.inria.fr/pub/docs/manual-ocaml-4.01/objectexamples.html#sec35 }}</ref>
दूसरे शब्दों में, जब आधार वर्ग (मूल वर्ग) के एक चर में व्युत्पन्न वर्ग (बाल वर्ग) का मान होता है, तो डाउनकास्टिंग संभव है।


कुछ भाषाएँ, जैसे कि ओकैमल, डाउनकास्टिंग की अनुमति नहीं देतीं हैं।<ref>{{Cite web | work =The OCaml system release 4.01 : Documentation and user's manual | title = OCaml में ऑब्जेक्ट| first1= Jérôme |last1=Vouillon |first2=Didier |last2=Rémy |first3=Jacques |last3=Garrigue| date = September 12, 2013 | accessdate =  | url = http://caml.inria.fr/pub/docs/manual-ocaml-4.01/objectexamples.html#sec35 }}</ref>


==उदाहरण==
==उदाहरण==
Line 26: Line 25:
}
}
</syntaxhighlight>
</syntaxhighlight>
=== सी++ ===
=== सी++ ===
<सिंटैक्सहाइलाइट लैंग=सी++>
<सिंटैक्सहाइलाइट लैंग=सी++>
Line 80: Line 77:
==संदर्भ==
==संदर्भ==
{{Reflist}}
{{Reflist}}
==बाहरी संबंध==
==बाहरी संबंध==
*[http://codebetter.com/blogs/jeremy.miller/archive/2006/12/26/Downcasting-is-a-Code-Smell.aspx Downcasting is a Code Smell] by Jeremy D. Miller
*[http://codebetter.com/blogs/jeremy.miller/archive/2006/12/26/Downcasting-is-a-Code-Smell.aspx Downcasting is a Code Smell] by Jeremy D. Miller

Revision as of 09:50, 17 July 2023

वर्ग-आधारित प्रोग्रामिंग में, डाउनकास्टिंग, या प्रकार परिशोधन, इसके व्युत्पन्न वर्गों में से एक में आधार वर्ग को अंतर्निहित रूप से संदर्भित करने का कार्य है।

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

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

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

उदाहरण

जावा

public class Fruit{}  // parent class
public class Apple extends Fruit{}  // child class

public static void main(String[] args) {
    // The following is an implicit upcast:
    Fruit parent = new Apple();
    // The following is a downcast. Here, it works since the variable `parent` is
    // holding an instance of Apple:
    Apple child = (Apple)parent;
//Where Apple is Child Class But Fruit is Parent Class
}

सी++

<सिंटैक्सहाइलाइट लैंग=सी++> // मूल वर्ग: वर्ग फल {

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

};

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

int मुख्य(int argc, const char** argv) {

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

} </सिंटैक्सहाइलाइट>

उपयोग

डाउनकास्टिंग तब उपयोगी होती है जब पैरेंट वेरिएबल द्वारा संदर्भित मान का प्रकार ज्ञात होता है और अक्सर किसी मान को पैरामीटर के रूप में पास करते समय इसका उपयोग किया जाता है। नीचे दिए गए उदाहरण में, विधि objectToString एक ऑब्जेक्ट पैरामीटर लेती है जिसे स्ट्रिंग प्रकार का माना जाता है।

public static String objectToString(Object myObject) {
    // This will only work when the myObject currently holding value is string.
    return (String)myObject;
}

public static void main(String[] args) {
    // This will work since we passed in String, so myObject has value of String.
    String result = objectToString("My String");
    Object iFail = new Object();
    // This will fail since we passed in Object which does not have value of String.
    result = objectToString(iFail);
}

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

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

विचार

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

यह भी देखें

संदर्भ

  1. Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (September 12, 2013). "OCaml में ऑब्जेक्ट". The OCaml system release 4.01 : Documentation and user's manual.

बाहरी संबंध