2012-11-29 20 views
5

कुछ खोज के बाद मुझे कॉपी कन्स्ट्रक्टर और विरासत के संबंध में मेरे प्रश्न का कोई अच्छा जवाब नहीं मिला। मेरे पास दो वर्ग हैं: उपयोगकर्ता और प्रशिक्षु। प्रशिक्षु उपयोगकर्ता से विरासत में मिलता है और दो स्ट्रिंग पैरामीटर ट्रेनी में जोड़े जाते हैं। अब मैं उपयोगकर्ता की प्रतिलिपि बनाने में कामयाब रहा हूं लेकिन मैं प्रशिक्षु की प्रतिलिपि निर्माता से संतुष्ट नहीं हूं।जावा कॉपी कन्स्ट्रक्टर और विरासत

public User (User clone) { 
    this(clone.getId(), 
     clone.getCivilite(), 
     clone.getNom(), 
     clone.getPrenom(), 
     clone.getEmail(), 
     clone.getLogin(), 
     clone.getTel(), 
     clone.getPortable(), 
     clone.getInscription(), 
     clone.getPw() 
    ); 
} 

मैं अपने प्रशिक्षु प्रति निर्माता में सुपर का उपयोग करने की कोशिश की: उपयोगकर्ता प्रतिलिपि निर्माता के कोड इस तरह है

public Trainee (Trainee clone) { 
    super (clone); 
    this (clone.getOsia(), clone.getDateNaiss()); 
} 

लेकिन यह काम नहीं किया और मैं एक कोड करने के लिए मजबूर किया गया था प्रतिलिपि निर्माता के पूर्ण संस्करण:

public Trainee (Trainee clone) { 
    this(clone.getId(), 
     clone.getCivilite(), 
     clone.getNom(), 
     clone.getPrenom(), 
     clone.getEmail(), 
     clone.getLogin(), 
     clone.getTel(), 
     clone.getPortable(), 
     clone.getInscription(), 
     clone.getPw(), 
     clone.getOsia(), 
     clone.getDateNaiss() 
    ); 
} 
मैं इस तरह अपने नए उदाहरण कास्ट करने के लिए है मेरी मुख्य के निर्माण की वजह से

:

User train = new Trainee(); 
    User train2 = new Trainee((Trainee) train); 

तो मेरा सवाल है: क्या ऐसा करने का कोई क्लीनर तरीका है? क्या मैं सुपर का उपयोग नहीं कर सकता?

आपके उत्तरों और सहायता के लिए अग्रिम धन्यवाद।

+2

जब आप 'सुपर (क्लोन) का इस्तेमाल किया क्या काम नहीं किया' – Xymostech

उत्तर

8

यह "पूर्ण" Trainee के लिए प्रतिलिपि निर्माता भी ले एक User बनाने के लिए बेहतर होगा:

public Trainee(Trainee clone) 
{ 
    this(clone, clone.getOsai(), clone.getDateNaiss()); 
} 

public Trainee(User clone, String osai, String dateNaiss) 
{ 
    super(clone); 
    this.osai = osai; 
    this.dateNaiss; 
} 

जहां तक ​​संभव हो, यह प्रत्येक में एक "मास्टर" निर्माता होने के पैटर्न के लिए रखने लायक है कक्षा, जो अन्य सभी रचनाकारों को प्रत्यक्ष या अप्रत्यक्ष रूप से श्रृंखलाबद्ध करती है।

अब, यह स्पष्ट नहीं है कि क्या यह एक Trainee बिना निर्दिष्ट करने मौजूदा उपयोगकर्ता जानकारी बनाने के लिए समझ में आता है ... या शायद किसी अन्य तरीके से यह निर्धारित करता है। यह हो सकता है कि इस मामले में आप वास्तव में करें में रचनाकारों के दो अलग-अलग सेट होने की आवश्यकता है - प्रतिलिपि बनाने वालों के लिए एक सेट, और "बस मुझे सभी मूल्यों को व्यक्तिगत रूप से" रचनाकारों के लिए सेट करें। यह वास्तव में आपके संदर्भ पर निर्भर करता है - हम केवल इससे नहीं बता सकते हैं।

उस मामले में, आप "एक मास्टर निर्माता" नियम को तोड़ने जाएगा थोड़ा है, लेकिन आप वहाँ दो मास्टर कंस्ट्रक्टर्स, विभिन्न प्रयोजनों के लिए निर्माताओं के प्रत्येक सेट के लिए एक होने के बारे में सोच सकते हैं। मूल रूप से, आप में चला रहे हैं "विरासत गंदा हो जाता है" - जो सब भी आम :(है

0

मुझे क्या करना होगा:

public Trainee (User clone) // By specifying `User` you allow the use in your code 
{ 
    super (clone); 
    if (clone instanceof Trainee) { 
     this.osia = clone.getOsia(); 
     this.dateNaiss = clone.getDateNaiss()); 
    } 
} 
+0

? मैं 'exampleof' ऑपरेटर से बचूंगा, यह आपको एक विशिष्ट प्रकार से जोड़ता है। –

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