सी ++ के समकक्ष instanceof
प्राप्त करने का सबसे पसंदीदा तरीका क्या है?
का उपयोग करने का प्रयास करें:
यदि (न्यूटिप * v = dynamic_cast & lt; NewType * & gt; )) {// पुरानी सुरक्षित रूप से न्यूटिप v- & gt; doSomething (); }
इस के लिए आपके संकलक को rtti समर्थन सक्षम होना आवश्यक है।
संपादित करें: इस उत्तर पर मेरे पास कुछ अच्छी टिप्पणियां हैं!
हर एक गतिशील_कास्ट (या उदाहरण के लिए) का उपयोग करने के लिए आपको बेहतर समय लगेगा कि क्या यह एक आवश्यक वस्तु है यह आम तौर पर खराब डिज़ाइन का संकेत है
ठेठ कामकाज उन वर्ग के विशेष व्यवहार को लगा रहा है जिसे आप बेस क्लास पर वर्चुअल फ़ंक्शन में देख रहे हैं या शायद कुछ ऐसी शुरुआत कर रहे हैं जहां आप इंटरफेस को बदलते बिना उप-क्लासेस के लिए विशिष्ट व्यवहार पेश कर सकते हैं पाठ्यक्रम का विज़िटर स्वीकार्य इंटरफ़ेस जोड़ना)।
जैसा कि बताया गया है कि गतिशील_कास्ट मुक्त नहीं है। एक सरल और निरंतर प्रदर्शन करने वाला हैक जो सबसे अधिक (लेकिन सभी मामलों में) हैंडल करता है, मूल रूप से आपकी कक्षा के सभी संभव प्रकारों का प्रतिनिधित्व करने वाला एक एनएम जोड़ रहा है और जांचता है कि क्या आपको सही एक मिला है।
यदि (पुराना- gt; getType () == बॉक्स) {बॉक्स * बॉक्स = स्थिर_कास्ट & lt; बॉक्स * & gt; (पुराना); // कुछ बॉक्स विशिष्ट}
यह अच्छा ओओ डिज़ाइन नहीं है, लेकिन यह एक वैकल्पिक हल हो सकता है और इसकी लागत केवल एक आभासी फ़ंक्शन कॉल है। यह आरटीटीआई की परवाह किए बिना काम करता है या नहीं।
ध्यान दें कि यह दृष्टिकोण विरासत के कई स्तरों का समर्थन नहीं करता है, इसलिए यदि आप सावधान नहीं हैं, तो आप इस तरह से दिख रहे कोड से समाप्त हो सकते हैं:
// हमारे पास एक विशेष बॉक्स वर्ग है जो बॉक्स को विरासत में लेता है, क्योंकि इसका अपना स्वयं का प्रकार है // हमें BOX या SPECIAL_BOX दोनों के लिए जांचना होगा यदि (पुराने- gt; getType () == बॉक्स = पुराने- & Gt; getType () == SPECIAL_BOX) {बॉक्स * बॉक्स = स्थिर_कास्ट & lt; बॉक्स * & gt; (पुराना); // कुछ बॉक्स विशिष्ट}
Comments
Post a Comment