Maison  >  Article  >  développement back-end  >  Exemple de code détaillé dans .NET Framework expliquant comment faire passer le clone de superficiel à profond

Exemple de code détaillé dans .NET Framework expliquant comment faire passer le clone de superficiel à profond

黄舟
黄舟original
2017-03-18 13:20:081274parcourir

Dans certains cas, nous avons besoin d'une copie superficielle pour résoudre le problème, car l'instance que nous copions fait toujours référenceà l'objet initial d'origine. Mais parfois, cela ne suffit pas, car l'instance que nous copions doit apporter des modifications et des ajustements de valeurs locales au type référence, et il est garanti qu'elle n'affectera pas l'objet initial !

Cela nécessite une copie approfondie !

Les exigences sont les suivantes :
Tout d'abord, examinons pourquoi une copie superficielle ne peut pas répondre à nos exigences : nous voulons copier le CV, et la version copiée n'est qu'incohérente avec le nom de l'entreprise dans le intention de candidature à un emploi du modèle de CV.

Notre première version du code ressemble à ceci :

ResumeModèleVersion 1.0

    public class ResumeInfo1:ICloneable
    {        
    public ResumeInfo1(string name, string telephone, EducationInfo educationInfo,WantedJob1 job)
        {            
        this._name = name;            
        this._telephone = telephone;            
        this._educationInfo = educationInfo;            
        this._wantedJob = job;
        }        
        private string _name;        
        public string name
        {            
        get { return this._name; }
        }       
         private string _telephone;        
         public string telephone
        {            
        get { return _telephone; }
        }        
        private EducationInfo _educationInfo;        
        public EducationInfo educationInfo
        {            
        get { return _educationInfo; }
        }        
        private WantedJob1 _wantedJob;        
        public WantedJob1 WantedJob
        {            
        get { return _wantedJob; }
        }        
        public object Clone()
        {           
        return this.MemberwiseClone();
        }


    }

L'objet d'arrière-plan éducatif de sous-classe imbriqué dans EducationInfo

    public class EducationInfo
    {        
    public string schoolName { get; set; }        
    public DateTime enrollTime { get; set; }        
    public DateTime leaveTime { get; set; }
    }

Il y a aussi un objet imbriqué WantedJob1 :

    public class WantedJob1
    {        
    public string companyName { get; set; }        
    public double eanrings { get; set; }

    }

On l'utilise sur le client :

            EducationInfo educationInfo = new EducationInfo();
            WantedJob1 wantedJob = new WantedJob1();
            ResumeInfo1 templateResume = new ResumeInfo1("qaz", "18810002000", educationInfo, wantedJob);
            educationInfo.enrollTime = new DateTime(2010, 7, 1);
            educationInfo.leaveTime = new DateTime(2015, 1, 1);
            educationInfo.schoolName = "wsx";
            wantedJob1.companyName = "edc";
            wantedJob1.eanrings = 1000;            
            //假定各个简历版本,仅仅companyName属性值不同。

            var res1 = templateResume.Clone();
            (res1 as ResumeInfo1).WantedJob.companyName = "baidu";            
            var res2 = templateResume.Clone();
            (res1 as ResumeInfo1).WantedJob.companyName = "ali";

Mais on obtient le nom de l'entreprise C'est ". ali"

Ceci est une copie superficielle typique !

ne peut pas répondre à l'exigence de distinction du nom de l'entreprise. Continuez à le modifier et à le changer en copie complète :

    public class ResumeInfo2:ICloneable
    {        
    public ResumeInfo2(string name, string telephone, EducationInfo educationInfo,WantedJob2 job)
        {            
        this._name = name;            
        this._telephone = telephone;            
        this._educationInfo = educationInfo;            
        this._wantedJob = job;
        }        //
        private void cloneJob(WantedJob2 job)
        {            
        this._wantedJob = job.Clone() as WantedJob2;
        }        private string _name;        
        public string name
        {            
        get { return this._name; }
        }        
        private string _telephone;        
        public string 
        telephone
        {            
        get { return _telephone; }
        }        
        private EducationInfo _educationInfo;        
        public EducationInfo educationInfo
        {            
        get { return _educationInfo; }
        }        
        private WantedJob2 _wantedJob;        
        public WantedJob2 WantedJob
        {            
        get { return _wantedJob; }
        }        
        public object Clone()
        {
            cloneJob(this._wantedJob);            
            return new ResumeInfo2(_name,_telephone,_educationInfo,_wantedJob);          
        }


    }

Objet d'intention de recherche d'emploi 2.0 :

   //WantedJob2 实现接口
    public class WantedJob2:ICloneable
    {        
    public string companyName { get; set; }        
    public double eanrings { get; set; }        
    public object Clone()
        {            
        return this.MemberwiseClone();
        }
    }
Appel client :

            //此处我们需要对WantedJob做深复制处理。

            EducationInfo educationInfo = new EducationInfo();
            WantedJob2 wantedJob = new WantedJob2();
            ResumeInfo2 templateResume = new ResumeInfo2("qaz", "18810002000", educationInfo, wantedJob);
            educationInfo.enrollTime = new DateTime(2010, 7, 1);
            educationInfo.leaveTime = new DateTime(2015, 1, 1);
            educationInfo.schoolName = "wsx";
            wantedJob.companyName = "edc";
            wantedJob.eanrings = 1000;            
            //假定各个简历版本,仅仅companyName属性值不同。

            var res1 = templateResume.Clone();
            (res1 as ResumeInfo2).WantedJob.companyName = "baidu";            
            var res2 = templateResume.Clone();
            (res2 as ResumeInfo2).WantedJob.companyName = "ali";
Obtenez différents noms d'entreprises ! Copie profonde réussie !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn