डाउनकास्टिंग: Difference between revisions
No edit summary |
No edit summary |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
वर्ग-आधारित प्रोग्रामिंग में, '''डाउनकास्टिंग''', या प्रकार परिशोधन, इसके व्युत्पन्न वर्गों में से एक में आधार वर्ग को अंतर्निहित रूप से संदर्भित करने का कार्य है। | वर्ग-आधारित प्रोग्रामिंग में, '''डाउनकास्टिंग''', या प्रकार परिशोधन, इसके व्युत्पन्न वर्गों में से एक में आधार वर्ग को अंतर्निहित रूप से संदर्भित करने का कार्य है। | ||
Line 25: | Line 23: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === C++ === | ||
< | <syntaxhighlight lang="c++"> | ||
// | // Parent class: | ||
class Fruit { | |||
public: | |||
// | // Must be polymorphic to use runtime-checked dynamic-cast. | ||
virtual ~Fruit() = default; | |||
}; | }; | ||
// | // Child class: | ||
class Apple : public Fruit {}; | |||
int | int main(int argc, const char** argv) { | ||
// | // The following is an implicit upcast: | ||
Fruit* parent = new Apple(); | |||
// | // The following is a downcast. Here, it works since the variable `parent` is | ||
// Apple | // holding an instance of Apple: | ||
Apple* | Apple* child = dynamic_cast<Apple*>(parent); | ||
} | } | ||
</ | </syntaxhighlight> | ||
==उपयोग== | ==उपयोग== | ||
डाउनकास्टिंग तब उपयोगी होती है जब पैरेंट वेरिएबल द्वारा संदर्भित मान का प्रकार ज्ञात होता है और | डाउनकास्टिंग तब उपयोगी होती है जब पैरेंट वेरिएबल द्वारा संदर्भित मान का प्रकार ज्ञात होता है और प्रायः मान को पैरामीटर के रूप में पास करते समय इसका उपयोग किया जाता है। नीचे दिए गए उदाहरण में, ऑब्जेक्टटूस्ट्रिंग (objectToString) विधि ऑब्जेक्ट पैरामीटर लेती है जिसे स्ट्रिंग प्रकार का माना जाता है। | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
public static String objectToString(Object myObject) { | public static String objectToString(Object myObject) { | ||
Line 63: | Line 61: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
इस दृष्टिकोण में, डाउनकास्टिंग | इस दृष्टिकोण में, डाउनकास्टिंग संकलक को संभावित त्रुटि का पता लगाने से रोकता है और इसके बजाय रन-टाइम त्रुटि का कारण बनता है। myObject को स्ट्रिंग ('(स्ट्रिंग) myObject') में डाउनकास्ट करना संकलन समय पर संभव नहीं था क्योंकि कई बार myObject स्ट्रिंग प्रकार होता है, इसलिए केवल रन टाइम पर ही हम यह पता लगा सकते हैं कि पारित पैरामीटर तार्किक है या नहीं। जबकि हम यूनिवर्सल java.lang.Object.toString() का उपयोग करके myObject को कंपाइल-टाइम स्ट्रिंग में भी परिवर्तित कर सकते हैं, इससे toString() के डिफ़ॉल्ट कार्यान्वयन को कॉल करने का आपत्तिपूर्ण होगा जहां यह अनुपयोगी या असुरक्षित था, और अपवाद हैंडलिंग इसे रोक नहीं सकती थी। | ||
C++ में, रन-टाइम प्रकार की जाँच | C++ में, रन-टाइम प्रकार की जाँच dynamic_cast के माध्यम से लागू की जाती है। कंपाइल-टाइम डाउनकास्टिंग को static_cast द्वारा कार्यान्वित किया जाता है, लेकिन यह ऑपरेशन कोई प्रकार की जाँच नहीं करता है। यदि इसका अनुचित प्रयोग किया जाए तो यह अपरिभाषित व्यवहार उत्पन्न कर सकता है। | ||
==विचार== | ==विचार== | ||
निकृष्ट समझे जाने वाले डिज़ाइन का एक लोकप्रिय उदाहरण शीर्ष प्रकार के कंटेनर हैं, जैसे कि [[जावा जेनेरिक]] पेश किए जाने से पहले जावा कंटेनर, जिसमें निहित वस्तुओं को डाउनकास्ट करने की आवश्यकता होती है ताकि उनका दोबारा उपयोग किया जा सके। | |||
==यह भी देखें== | ==यह भी देखें== | ||
*[[उपप्रकार बहुरूपता]] | *सबटाइप पॉलीमॉर्फिज्म ([[उपप्रकार बहुरूपता]]) | ||
==संदर्भ== | ==संदर्भ== | ||
Line 84: | Line 81: | ||
*[http://doi.acm.org/10.1145/311963.312008 Multiple downcasting techniques] | *[http://doi.acm.org/10.1145/311963.312008 Multiple downcasting techniques] | ||
*[http://forum.codecall.net/java-tutorials/20719-upcasting-downcasting.html Upcasting, downcasting] by Sinipull | *[http://forum.codecall.net/java-tutorials/20719-upcasting-downcasting.html Upcasting, downcasting] by Sinipull | ||
[[Category:Created On 10/07/2023]] | [[Category:Created On 10/07/2023]] | ||
[[Category:Machine Translated Page]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:उदाहरण जावा कोड वाले लेख]] | |||
[[Category:क्लास (कंप्यूटर प्रोग्रामिंग)]] |
Latest revision as of 19:37, 21 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
}
C++
// Parent class:
class Fruit {
public:
// Must be polymorphic to use runtime-checked dynamic-cast.
virtual ~Fruit() = default;
};
// Child class:
class Apple : public Fruit {};
int main(int argc, const char** argv) {
// 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 = dynamic_cast<Apple*>(parent);
}
उपयोग
डाउनकास्टिंग तब उपयोगी होती है जब पैरेंट वेरिएबल द्वारा संदर्भित मान का प्रकार ज्ञात होता है और प्रायः मान को पैरामीटर के रूप में पास करते समय इसका उपयोग किया जाता है। नीचे दिए गए उदाहरण में, ऑब्जेक्टटूस्ट्रिंग (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++ में, रन-टाइम प्रकार की जाँच dynamic_cast के माध्यम से लागू की जाती है। कंपाइल-टाइम डाउनकास्टिंग को static_cast द्वारा कार्यान्वित किया जाता है, लेकिन यह ऑपरेशन कोई प्रकार की जाँच नहीं करता है। यदि इसका अनुचित प्रयोग किया जाए तो यह अपरिभाषित व्यवहार उत्पन्न कर सकता है।
विचार
निकृष्ट समझे जाने वाले डिज़ाइन का एक लोकप्रिय उदाहरण शीर्ष प्रकार के कंटेनर हैं, जैसे कि जावा जेनेरिक पेश किए जाने से पहले जावा कंटेनर, जिसमें निहित वस्तुओं को डाउनकास्ट करने की आवश्यकता होती है ताकि उनका दोबारा उपयोग किया जा सके।
यह भी देखें
- सबटाइप पॉलीमॉर्फिज्म (उपप्रकार बहुरूपता)
संदर्भ
- ↑ Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (September 12, 2013). "OCaml में ऑब्जेक्ट". The OCaml system release 4.01 : Documentation and user's manual.
बाहरी संबंध
- 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