2008-08-26 14 views
22

हम अक्सर सुनते/पढ़ते हैं कि किसी को गतिशील कास्टिंग से बचना चाहिए। मैं सोच रहा था कि आपके अनुसार 'अच्छा उपयोग' उदाहरण क्या होगा?गतिशील कास्टिंग के कुछ 'अच्छे उपयोग' उदाहरण क्या हैं?

संपादित करें:

हाँ, मैं that other thread के बारे में पता कर रहा हूँ: यह वास्तव में जब वहाँ पहले जवाब में से एक है कि मैं अपने प्रश्न पूछा पढ़ रही है!

+12

इस प्रश्न का शीर्षक वर्णन से बिल्कुल मेल नहीं खाता है। – bradtgmurray

उत्तर

0

मेरा वर्तमान खिलौना प्रोजेक्ट गतिशील_कास्ट का दो बार उपयोग करता है; एक बार सी ++ में एकाधिक प्रेषण की कमी के आसपास काम करने के लिए (यह एक विज़िटर-स्टाइल सिस्टम है जो गतिशील_casts के बजाय एकाधिक प्रेषण का उपयोग कर सकता है), और एक बार विशेष मामले के लिए एक विशिष्ट उप प्रकार।

इनमें से दोनों स्वीकार्य हैं, मेरे विचार में, हालांकि पूर्व में कम से कम एक भाषा घाटे से उत्पन्न होता है। मुझे लगता है कि यह वास्तव में एक आम स्थिति हो सकती है; सबसे गतिशील_casts (और सामान्य रूप से एक महान "डिजाइन पैटर्न") कुछ ऐसी चीज के बजाय विशिष्ट भाषा त्रुटियों के लिए कामकाज हैं।

0

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

1

यहां कुछ ऐसा है जो मैं अक्सर करता हूं, यह सुंदर नहीं है, लेकिन यह सरल और उपयोगी है।

मैं अक्सर टेम्पलेट कंटेनर है कि एक इंटरफ़ेस को लागू के साथ काम करते हैं,

template<class T> 
class MyVector : public ContainerInterface 
... 

कहाँ ContainerInterface बुनियादी उपयोगी सामग्री है की तरह कुछ कल्पना है, लेकिन इतना ही है। अगर मैं अपने टेम्पलेट कार्यान्वयन को उजागर किए बिना पूर्णांक के वैक्टरों पर एक विशिष्ट एल्गोरिदम चाहता हूं, तो कार्यान्वयन में इंटरफ़ेस ऑब्जेक्ट्स और डायनामिक_कास्ट को इसे MyVector पर स्वीकार करना उपयोगी होता है। उदाहरण:

// function prototype (public API, in the header file) 
void ProcessVector(ContainerInterface& vecIfce); 

// function implementation (private, in the .cpp file) 
void ProcessVector(ContainerInterface& vecIfce) 
{ 
    MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce); 
    // the cast throws bad_cast in case of error but you could use a 
    // more complex method to choose which low-level implementation 
    // to use, basically rolling by hand your own polymorphism. 

    // Process a vector of integers 
    ... 
} 

मैं ContainerInterface कि polymorphically का समाधान किया जाएगा करने के लिए एक प्रक्रिया() विधि जोड़ सकता है, यह एक अच्छा OOP तरीका होगा, लेकिन मैं कभी कभी यह इस तरह से करने के लिए पसंद करते हैं। जब आपके पास साधारण कंटेनर होते हैं, तो बहुत सारे एल्गोरिदम और आप अपना कार्यान्वयन छुपा रखना चाहते हैं, गतिशील_कास्ट एक आसान और बदसूरत समाधान प्रदान करता है।

आप डबल-प्रेषण तकनीकों को भी देख सकते हैं।

HTH

0

खैर यह वास्तव में सी # में विस्तार के तरीकों के साथ अच्छा होगा।

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

तो

List<myObject> myObjectList = getMyObjects(); 

List<string> ids = myObjectList.PropertyList("id"); 

की तरह कुछ विस्तार विधि आप प्रकार है कि में आ रहा है पता नहीं होगा पर छोड़कर शांत हो जाएगा।

तो

public static List<string> PropertyList(this object objList, string propName) { 
    var genList = (objList.GetType())objList; 
} 

भयानक होगा।

9

यह हालिया धागा एक उदाहरण देता है जहां यह काम में आता है। आधार आकार वर्ग और वर्ग सर्किल और आयताकार से निकला है। समानता के परीक्षण में, यह स्पष्ट है कि एक सर्किल एक आयताकार के बराबर नहीं हो सकता है और यह तुलना करने की कोशिश करने के लिए आपदा होगी। आकारों के पॉइंटर्स के संग्रह के माध्यम से पुनरावृत्ति करते समय, गतिशील_कास्ट डबल ड्यूटी करता है, आपको बताता है कि आकार तुलनीय हैं और तुलना करने के लिए आपको उचित वस्तुएं दे रही हैं।

Vector iterator not dereferencable

0

यह है बहुत ही उपयोगी है, तथापि, कई बार यह है के सबसे भी उपयोगी: अगर काम किया सबसे आसान तरीका प्राप्त करने के लिए एक dynamic_cast क्या करना है, यह अधिक बार की नहीं एक लक्षण से है खराब ओओ डिजाइन, जो बदले में भविष्य में अप्रत्याशित तरीकों से परेशानी का कारण बन सकता है।

संबंधित मुद्दे