C# Language
ICloneable
खोज…
वाक्य - विन्यास
- ऑब्जेक्ट ICloneable.Clone () {रिटर्न क्लोन (); } // इंटरफ़ेस का निजी कार्यान्वयन जो हमारे कस्टम पब्लिक क्लोन () फ़ंक्शन का उपयोग करता है।
- सार्वजनिक फू क्लोन () {नया फू लौटाओ (यह); } // सार्वजनिक क्लोन विधि को कॉपी कंस्ट्रक्टर लॉजिक का उपयोग करना चाहिए।
टिप्पणियों
CLR
को एक विधि परिभाषा object Clone()
आवश्यकता होती है जो सुरक्षित नहीं है। इस व्यवहार को ओवरराइड करना और एक प्रकार की सुरक्षित विधि को परिभाषित करना आम बात है जो युक्त वर्ग की एक प्रति लौटाता है।
यह लेखक पर निर्भर है कि क्लोनिंग का अर्थ केवल उथली प्रति या गहरी प्रति है। संदर्भ युक्त अपरिवर्तनीय संरचनाओं के लिए एक गहरी प्रतिलिपि करने की सिफारिश की जाती है। कक्षाओं के लिए खुद को संदर्भ देने के लिए शायद उथली प्रतिलिपि को लागू करना ठीक है।
नोट: C#
एक इंटरफ़ेस विधि को ऊपर दिखाए गए सिंटैक्स के साथ निजी रूप से लागू किया जा सकता है।
एक कक्षा में ICloneable लागू करना
एक मोड़ के साथ एक कक्षा में ICloneable
लागू करें। सार्वजनिक प्रकार के सुरक्षित Clone()
उजागर करें और object Clone()
निजी रूप से लागू करें।
public class Person : ICloneable
{
// Contents of class
public string Name { get; set; }
public int Age { get; set; }
// Constructor
public Person(string name, int age)
{
this.Name=name;
this.Age=age;
}
// Copy Constructor
public Person(Person other)
{
this.Name=other.Name;
this.Age=other.Age;
}
#region ICloneable Members
// Type safe Clone
public Person Clone() { return new Person(this); }
// ICloneable implementation
object ICloneable.Clone()
{
return Clone();
}
#endregion
}
बाद में निम्नानुसार उपयोग किया जाना चाहिए:
{
Person bob=new Person("Bob", 25);
Person bob_clone=bob.Clone();
Debug.Assert(bob_clone.Name==bob.Name);
bob.Age=56;
Debug.Assert(bob.Age!=bob.Age);
}
ध्यान दें कि bob
की उम्र बदलने से bob_clone
की उम्र नहीं बदलती है। ऐसा इसलिए है क्योंकि डिज़ाइन (संदर्भ) चर को असाइन करने के बजाय क्लोनिंग का उपयोग करता है।
एक संरचना में ICloneable लागू करना
एक संरचना के लिए ICloneable के कार्यान्वयन की आमतौर पर आवश्यकता नहीं होती है क्योंकि संरचना असाइनमेंट ऑपरेटर =
साथ एक सदस्यवार प्रतिलिपि बनाती है। लेकिन डिजाइन को एक और इंटरफ़ेस के कार्यान्वयन की आवश्यकता हो सकती है जो कि ICloneable
से विरासत में मिली है।
एक अन्य कारण यह होगा कि यदि संरचना में एक संदर्भ प्रकार (या एक सरणी) होता है, जिसे कॉपी करने की भी आवश्यकता होती है।
// Structs are recommended to be immutable objects
[ImmutableObject(true)]
public struct Person : ICloneable
{
// Contents of class
public string Name { get; private set; }
public int Age { get; private set; }
// Constructor
public Person(string name, int age)
{
this.Name=name;
this.Age=age;
}
// Copy Constructor
public Person(Person other)
{
// The assignment operator copies all members
this=other;
}
#region ICloneable Members
// Type safe Clone
public Person Clone() { return new Person(this); }
// ICloneable implementation
object ICloneable.Clone()
{
return Clone();
}
#endregion
}
बाद में निम्नानुसार उपयोग किया जाना चाहिए:
static void Main(string[] args)
{
Person bob=new Person("Bob", 25);
Person bob_clone=bob.Clone();
Debug.Assert(bob_clone.Name==bob.Name);
}