2013-03-18 7 views
5

इस साइट के बाद कैसे बनाएं: http://www.csharp411.com/c-object-clone-wars/मैन्युअल रूप से एक गहरी प्रतिलिपि

मैं मैन्युअल रूप से मेरी कक्षा की गहरी प्रतिलिपि बनाने का फैसला किया (साइट 1. क्लोन मैन्युअल के बाद)। मैंने क्लोन इंटरफेस और किसी भी आवश्यक गुणों को लागू किया। मैंने अपने कार्यक्रम को निष्पादित किया और जांच की कि क्या मेरा क्लोन वास्तव में मूल उदाहरण भी बराबर था। यह सही था।

हालांकि, मेरा नया उदाहरण अभी भी मूल के संदर्भ में है। तो मेरी प्रतिलिपि में कोई भी परिवर्तन जहां मूल उदाहरण में दिखाई देता है।

तो यदि यह एक गहरी प्रतिलिपि नहीं बनाता है, तो क्या करता है? क्या गलत हो सकता था?

(मैं एक गहरी प्रतिलिपि हस्तचालित रूप से अपने प्रदर्शन को बढ़ाने के लिए करना चाहते हैं, तो मैं ObjectCopier वर्ग का उपयोग नहीं करना चाहते हैं। (यह काम करता है, भले ही महान है, यह मेरी कोड रन टाइम का 90% लेता है)

कोड स्निपेट्स:

कक्षा औजार:

public class SudokuAlgorithmNorvig: ICloneable 
{ 

क्लोन विधि:

public object Clone() 
    { 
     SudokuAlgorithmNorvig sudokuClone = new SudokuAlgorithmNorvig(this.BlockRows, this.BlockColumns); 

     sudokuClone.IsSucces = this.IsSucces; 

     if (this.Grid != null) sudokuClone.Grid = (Field[,])this.Grid; 
     if (this.Peers != null) sudokuClone.Peers = (Hashtable)this.Peers; 
     if (this.Units != null) sudokuClone.Units = (Hashtable)this.Units; 

     return sudokuClone; 
    } 

क्लोन विधि कॉल:

SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone() 

मैं अपने सभी अन्य वर्गों में एक ही (लागू करने और स्थापित करने क्लोन विधि) किया था। (Field + Coordinate)

+2

हमें यह देखने के लिए कि क्या गलत हुआ है, हमें आपके कोड को देखने की आवश्यकता है। समस्या का प्रदर्शन करने वाला सबसे छोटा कोड नमूना सबसे अच्छा होगा। –

+1

हां, एहसास हुआ कि :) अब इसे कार्यान्वित करें, धन्यवाद – dylanmensaert

+1

ठीक है, ऐसा लगता है कि आप केवल ऑब्जेक्ट का उथला क्लोन कर रहे हैं। उदाहरण के लिए, 'sudokuClone.Grid = (फ़ील्ड [,]) यह। ग्रिड' एक नई प्रतिलिपि पर 'sudokuClone.Grid' को इंगित नहीं कर रहा है! –

उत्तर

3

ऐसा लगता है कि आप प्रतियां बनाने के बजाय सभी जगहों पर मौजूद मौजूदा वस्तुओं के संदर्भ बना रहे हैं।

BlockRows और BlockColumns कस्टम वस्तुओं है कि आप नई वस्तु में गुजर रहे हैं? मौजूदा ऑब्जेक्ट में वे केवल BlockRows और BlockColumns के संदर्भ होंगे, इसलिए पहले ऑब्जेक्ट में उन उदाहरणों में से एक को दूसरे में बदल दिया जाएगा।

मुझे नहीं पता कि Grid, Peers, और Units प्रतिनिधित्व करते हैं, लेकिन उनमें से अधिकतर संदर्भ भी होंगे। आपको उन सभी वर्गों को क्लोन करने योग्य भी बनाना होगा। अन्यथा, आपके SudokuAlgorithmNorvig क्लास के पहले उदाहरण में Grid बदलना दूसरे उदाहरण में संबंधित Grid को बदल देगा।

+0

ठीक है, सुडोकू एल्गोरिदम नोर्विग के निर्माता में ब्लॉकरो और ब्लॉककॉल सेट किए जा रहे हैं। तो वास्तव में यह नहीं पता कि इसे कैसे क्लोन करें। – dylanmensaert

+0

उन्हें भी क्लोनेबल बनाएं, और 'BlockRows.Clone() 'और' BlockColumns 'पास करें।नए उदाहरण के निर्माता में क्लोन() '। –

+0

ग्रिड एक प्रकार का 2 आयामी सरणी है फ़ील्ड (कस्टम क्लास जहां मैंने क्लोन को उसी तरह कार्यान्वित किया)। सहकर्मी और इकाइयां हैंशैप्स हैं जिनमें फ़ील्ड भी शामिल है। तो क्या मुझे क्लैम करने में सक्षम होने के लिए हैशपैप और सरणी के साथ कुछ खास करना है? – dylanmensaert

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