2010-04-20 7 views
12

मुझे इस प्रश्न से मेरे एक साक्षात्कार में पूछा गया था, लेकिन मैं यह पता लगाने में सक्षम नहीं था कि यह अवधारणा क्यों नहीं है।सी # क्रिस्ट कन्स्ट्रक्टर की अवधारणा का समर्थन क्यों नहीं करता है?

कृपया मुझे बताएं।

+0

"प्रतिलिपि" से आपका मतलब "गहरी प्रतिलिपि" है, है ना? –

+0

क्या आप वाकई एक चाल प्रश्न नहीं थे? :) – Tony

+2

मुझे लगता है कि वास्तविक सवाल यह है कि डिफ़ॉल्ट क्यों नहीं है। http://en.wikipedia.org/wiki/Copy_constructor – juharr

उत्तर

2

क्या यह नहीं है?

class Foo 
{ 
    public Foo (Foo other) // copy ctor 
    { ... } 
} 

लेकिन शायद मैं क्या अन्य नियमों सी में लागू के बारे में थोड़ा जंग लगी हूँ ++ (जहाँ शब्द प्रतिलिपि निर्माता गढ़ा गया था)।

+0

सी ++ (सी ++ 11 कम से कम) में, आप निम्न द्वारा एक प्रतिलिपि बना सकते हैं: "Foo (Foo अन्य) = डिफ़ॉल्ट;", जो आमतौर पर सभी फ़ील्ड कॉपी कन्स्ट्रक्टर को कॉल करने के लिए डिफ़ॉल्ट होगा (या मूल प्रकार के लिए असाइनमेंट int, float, और पॉइंटर्स की तरह)। यदि किसी क्षेत्र के लिए कोई कॉपी कन्स्ट्रक्टर मौजूद नहीं है, तो संकलक दुखी हो जाएगा। – Doug

6

सी # एक प्रतिलिपि निर्माता के विचार का समर्थन नहीं करता है? आप एक ऐसा बनाने के लिए स्वतंत्र हैं जो आपकी पसंद के रूप में गहरी प्रतियां है।

+4

+1: सी # में एक निहित रूप से परिभाषित प्रतिलिपि नहीं है, लेकिन यह एक सी ++ सुविधा है जो तर्कसंगत रूप से अच्छा से अधिक नुकसान करती है ताकि आप कह सकें कि सी # ने सीखा सबक के कारण इसे छोड़ दिया है। –

+0

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

28

यह भाषा में नहीं बनाया गया है क्योंकि कोई उचित डिफ़ॉल्ट कार्यान्वयन नहीं है।

रचनाकार suffer from many of the same ambiguities as cloning कॉपी करें। उदाहरण के लिए, चाहे आप एक उथली प्रतिलिपि बनाना चाहते हैं या एक गहरी प्रतिलिपि आपकी विशेष परिस्थितियों पर निर्भर करती है।

कहें कि आपके पास कक्षा Customer संपत्ति के साथ है। क्या इसकी प्रतिलिपि बनाने वाला नया ग्राहक बना सकता है या मूल उदाहरण को इंगित करता है? शायद मूल उदाहरण - लेकिन Order.Payment के बारे में क्या?

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

यदि यह पर्याप्त नहीं है, तो this article on Java Design Issues कुछ अन्य समस्याओं को हाइलाइट करता है (जैसे प्रकार छंटनी)।

+2

+1 पर अंतर्निहित प्रतिलिपि बनाने के लिए कोई उचित डिफ़ॉल्ट व्यवहार नहीं होने पर जोर देने के लिए +1। सटीक। –

+2

इसके अलावा, अगर इसे सी ++ की तरह बनाया गया था, तो आप गहरी क्लोनिंग प्राप्त कर सकते हैं चाहे आप इसे चाहते हों या नहीं: this._PrivateFieldForCustomer = source._PrivateFieldForCustomer; <- कॉपी कन्स्ट्रक्टर का आह्वान करता है। –

+2

सी ++ डिफ़ॉल्ट सभी प्रति वर्गों और सदस्यों की प्रतिलिपि बनाना है, उनकी प्रति रचनाकारों का उपयोग करना। यह हमेशा आप नहीं चाहते हैं, लेकिन मैं इसे एक उचित डिफ़ॉल्ट मानता हूं। –

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

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