के लिए, कि कोड है या तो SuperType
वर्ग या उपवर्ग, या अपने SuperType
प्रकार के अंदर एक सार्वजनिक clone()
विधि होनी चाहिए:
abstract class SuperType {
public SuperType(SuperType t) {
}
public abstract SuperType deepCopy();
}
class SomeType extends SuperType {
SomeType(SomeType t) {
//copy constructor
}
@Override
public SomeType deepCopy() {
return new SomeType(this);
}
}
...
SuperType original = new SubType();
SuperType copy = original.deepCopy(); //the deepCopy is called on children classes
भी देखें। एक सार्वजनिक clone()
विधि स्वचालित रूप से मौजूद नहीं है, और आपको इसे लागू करना होगा। आप उस मामले के लिए इसे और कुछ भी कह सकते हैं, उदा। copy()
।
आपका प्रश्न तब है, clone()
(या जिसे आप इसे कहते हैं) विधि को कार्यान्वित करना है ताकि यह पॉलिमॉर्फिक क्लोनिंग कर सके।
जावा डेवलपर्स द्वारा लक्षित किया गया तरीका super.clone()
पर कॉल करना है, यह मानते हुए कि विरासत पदानुक्रम में सभी वर्गों ने समान रूप से clone()
को पॉलिमॉर्फिक क्लोनिंग करने के लिए लागू किया है। यह अंततः सुरक्षित Object.clone()
विधि तक पहुंच जाता है, जो पॉलिमॉर्फिक क्लोनिंग का जादू करता है। ध्यान दें कि अपवाद फेंकने के लिए Object.clone()
के लिए, आपकी कक्षा को Cloneable
इंटरफ़ेस लागू करना होगा।
हालांकि, अन्य संभावित तरीके भी हैं। उदाहरण के लिए, यह मानते हुए कि सभी उप-वर्गों में एक डिफ़ॉल्ट कन्स्ट्रक्टर है, आप this.getClass().newInstance()
जैसे कुछ कर सकते हैं। यह सही वर्ग का एक वस्तु बना देगा, लेकिन खेतों की प्रतिलिपि बनाई गई नहीं है। आपके क्लोन विधि को सभी फ़ील्ड कॉपी करने की आवश्यकता होगी, और उप-वर्गों को अपने क्लोन विधि को अपने फ़ील्ड की प्रतिलिपि बनाने के लिए ओवरराइड करना होगा। ध्यान दें कि यह अप्रासंगिक है कि Cloneable
इंटरफ़ेस इस मामले में लागू किया गया है या नहीं।
एक और तरीका यह सोचते हैं कि वर्ग Serializable है, को क्रमानुसार और this
unserialize करने के लिए, है। यह एक बहुलक क्लोन बनाना चाहिए जिसमें सभी धारावाहिक खेतों को पूरा किया जाए।
आप एक रचनाकार नहीं बना सकते हैं कि जिस वस्तु को आप क्लोन करना चाहते हैं उसे पास किया जा सकता है? – Justin
@gangqinlaohu निश्चित रूप से, मैं कर सकता हूं, लेकिन फिर मुझे 'नया सबटाइप (मूल)' कॉल करने की आवश्यकता होगी, क्योंकि मैं कोड लिखने के समय में नहीं जानता क्योंकि मूल वास्तव में वर्ग 'सबटाइप' या 'सबटाइप 2' , या 'सबसब टाइप'। – Posa