In einigen Fällen benötigen wir eine flache Kopie, um das Problem zu lösen, da die Instanz, die wir kopieren, immer noch auf das ursprüngliche ursprüngliche Objekt verweist. Manchmal reicht dies jedoch nicht aus, da die von uns kopierte Instanz lokale Wertänderungen und Anpassungen am Referenztyp vornehmen muss und dies garantiert keine Auswirkungen auf das ursprüngliche Objekt hat!
Dies erfordert tiefes Kopieren! Die Anforderungen lauten wie folgt:Lassen Sie uns zunächst einen Blick darauf werfen, warum flache Kopien unsere Anforderungen nicht erfüllen können: Wir möchten den Lebenslauf kopieren, und die kopierte Version stimmt nur nicht mit dem Firmennamen in überein Bewerbungsabsicht der Vorlage Lebenslauf.
ModellVersion 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(); } }
public class EducationInfo { public string schoolName { get; set; } public DateTime enrollTime { get; set; } public DateTime leaveTime { get; set; } }
public class WantedJob1 { public string companyName { get; set; } public double eanrings { get; set; } }
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";
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); } }
//WantedJob2 实现接口 public class WantedJob2:ICloneable { public string companyName { get; set; } public double eanrings { get; set; } public object Clone() { return this.MemberwiseClone(); } }
//此处我们需要对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";
Das obige ist der detaillierte Inhalt von.NET Framework-detaillierter Beispielcode zum Ändern des Klonens von „flach' in „tief'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!