C # में, कक्षा में कार्यक्षमता जोड़ने के लिए (डीप) कॉपी करने का पसंदीदा तरीका क्या है? क्या किसी को कॉपी कंस्ट्रक्टर को लागू करना चाहिए, या ICloneable से प्राप्त करना चाहिए और क्लोन () विधि को लागू करना चाहिए?
ICloneableजैसा कि दूसरों ने उल्लेख किया है कि यह समस्या है, यह निर्दिष्ट नहीं करता है कि यह एक गहरी या उथली प्रति है, जो इसे व्यावहारिक रूप से अनुपयोगी बना देती है और व्यवहार में, शायद ही कभी इसका उपयोग किया जाता है। यह भी लौटता है object, जो एक दर्द है, क्योंकि इसमें बहुत अधिक कास्टिंग की आवश्यकता होती है। (और यद्यपि आपने विशेष रूप से प्रश्न में कक्षाओं का उल्लेख किया है, ICloneableपर लागू करनाstruct बॉक्सिंग की आवश्यकता है।)
एक प्रतिलिपि अवरोधक भी ICloneable के साथ समस्याओं में से एक से ग्रस्त है। यह स्पष्ट नहीं है कि एक प्रतिलिपि निर्माता एक गहरी या उथली प्रतिलिपि बना रहा है या नहीं।
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
डीपक्लोन () विधि बनाना सबसे अच्छा होगा। इस तरह से मंशा पूरी तरह स्पष्ट है।
यह इस सवाल को उठाता है कि क्या यह एक स्थिर या उदाहरण विधि होना चाहिए।
Account clonedAccount = currentAccount.DeepClone(); // instance method
या
Account clonedAccount = Account.DeepClone(currentAccount); // static method
मैं कभी-कभी स्थैतिक संस्करण को थोड़ा पसंद करता हूं, सिर्फ इसलिए कि क्लोनिंग कुछ ऐसा लगता है जो ऑब्जेक्ट के बजाय किसी वस्तु को किया जा रहा है। या तो मामले में, ऐसे मुद्दों से निपटने के लिए जा रहे हैं जब क्लोनिंग ऑब्जेक्ट्स जो एक वंशानुगत पदानुक्रम का हिस्सा हैं, और उन मुद्दों के साथ कैसे अंत में डिज़ाइन को ड्राइव कर सकते हैं।
class CheckingAccount : Account
{
CheckAuthorizationScheme checkAuthorizationScheme;
public override Account DeepClone()
{
CheckingAccount clone = new CheckingAccount();
DeepCloneFields(clone);
return clone;
}
protected override void DeepCloneFields(Account clone)
{
base.DeepCloneFields(clone);
((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();
}
}