मुझे C # में ICloneable क्यों लागू करना चाहिए?


110

कारण है कि मैं से विरासत चाहिए तुम मेरे लिए व्याख्या कर सकते हैं ICloneableऔर लागू Clone()विधि?

अगर मैं एक गहरी कॉपी करना चाहता हूं, तो क्या मैं सिर्फ अपने तरीके को लागू नहीं कर सकता हूं? आइए बताते हैं MyClone()?

मुझे विरासत से क्यों लेना चाहिए ICloneable? क्या फायदे हैं? क्या यह केवल "अधिक पठनीय" कोड बनाने की बात है?


जवाबों:


117

आपको नहीं करना चाहिए Microsoft कार्यान्वयन के विरुद्ध अनुशंसा करता है ICloneableक्योंकि इंटरफ़ेस से कोई स्पष्ट संकेत नहीं है कि क्या आपका Cloneतरीका "गहरा" या "उथला" क्लोन करता है।

अधिक जानकारी के लिए 2003 (!) में ब्रैड अब्राम्स के इस ब्लॉग पोस्ट को देखें।


4
लेख का
वेकबैक

2
एक बेहतर लिंक: blogs.msdn.microsoft.com/brada/2004/05/03/…
एरिक

29

ICloneableइंटरफ़ेस अपने आप में जो कहना है कि वहाँ वास्तव में कई स्थितियों नहीं हैं, जहां यह पता चला है कि एक वस्तु इसके बारे में कुछ और जानने के बिना cloneable है उपयोगी है बहुत उपयोगी नहीं है,। यह उदाहरण IEnumerableया IDisposable; ऐसी कई स्थितियाँ हैं, जहाँ इसे स्वीकार करने के IEnumerableअलावा और कुछ जाने बिना स्वीकार करना उपयोगी है।

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

एक बार जो पूरा हो गया, एक विधि जो किसी WonderfulBaseप्रकार की वस्तु को स्वीकार करना चाहती है , और इसे क्लोन करने में सक्षम होने के लिए, एक WonderfulBase ऑब्जेक्ट को स्वीकार करने के लिए कोडित किया जा सकता है जो क्लोनिंग का समर्थन करता है (बेस-प्रकार और ICloneableबाधाओं के साथ एक सामान्य प्रकार के पैरामीटर का उपयोग करके ) । हालाँकि ICloneableइंटरफ़ेस स्वयं को गहरे या उथले क्लोनिंग का संकेत नहीं देगा, लेकिन प्रलेखन WonderfulBaseयह संकेत देगा कि क्लोन करने योग्य गहरा WonderfulBaseहोना चाहिए या उथला-क्लोन किया गया है। अनिवार्य रूप से, ICloneableइंटरफ़ेस कुछ भी पूरा नहीं करेगा जिसे परिभाषित करके पूरा नहीं किया जाएगा ICloneableWonderfulBase, सिवाय इसके कि यह हर अलग-अलग क्लोन बेस क्लास के लिए अलग-अलग नामों को परिभाषित करने से बचाएगा।


18

ICloneableबीसीएल में उन कलाकृतियों में से एक है जो विवादास्पद रही है। इसे लागू करने का कोई वास्तविक कारण IMHO नहीं है। इसके साथ ही अगर मैं एक क्लोन विधि बनाने जा रहा हूं ICloneable, तो मैं इसे लागू करता हूं , और मैं अपना खुद का मजबूत टाइप संस्करण प्रदान करता हूं Clone

इसके साथ समस्या ICloneableयह है कि यदि Cloneउथली या गहरी प्रति है तो यह इंगित नहीं किया जाता है कि बहुत अलग चीजें हैं। तथ्य यह है कि ICloneable<T>ICloneable के बारे में Microsoft के विचारों पर कोई संकेत नहीं हो सकता है


9

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.