3.4 简历的深复制实现
/// <summary>
/// 实现了ICloneable接口的简历类
/// </summary>
public class Resume : ICloneable
{
public Resume()
{
mWorkExperience = new WorkExperience();
}
/// <summary>
/// 这里使用一个私有的构造函数来对其连接到的引用类型进行复制
/// </summary>
/// <param name="workExperience"></param>
private Resume(WorkExperience workExperience)
{
this.mWorkExperience = (WorkExperience)workExperience.Clone();
}
private string mName;
private string mSex;
private int mAge;
private WorkExperience mWorkExperience;
public string Name
{
get { return mName; }
set { mName = value; }
}
public string Sex
{
get { return mSex; }
set { mSex = value; }
}
public int Age
{
get { return mAge; }
set { mAge = value; }
}
public WorkExperience WorkExperience
{
get { return mWorkExperience; }
}
/// <summary>
/// 设置功过经历
/// </summary>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <param name="company"></param>
/// <param name="position"></param>
public void SetWorkExperience(DateTime startDate, DateTime endDate, string company, string position)
{
this.mWorkExperience.Company = company;
this.mWorkExperience.EndDate = endDate;
this.mWorkExperience.StartDate = startDate;
this.mWorkExperience.Position = position;
}
/// <summary>
/// 实现ICloneable接口的Clone方法
/// </summary>
/// <returns></returns>
public object Clone()
{
// 这里不再使用MemberwiseClone方法进行复制了,而是新创建了一个全新的简历。它完全是在内部实现的,外部不用关心它的实现
Resume newResume = new Resume(this.mWorkExperience);
newResume.mSex = this.mSex;
newResume.mName = this.mName;
newResume.mAge = this.mAge;
return newResume;
}
}
public class WorkExperience :ICloneable
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string Company { get; set; }
public string Position { get; set; }
public object Clone()
{
// 使用.Net 为我们提供的浅复制对象的方法,因为这里已经没有引用对象了(string虽然是引用类型,但.NET为我们做了特别处理,可以像值类型一样使用它)。
return this.MemberwiseClone();
}
}
测试代码如下
[TestMethod]
public void TestDeepCopy()
{
Resume myFirstResume = new Resume
{
Age = 29,
Name = "Kevin Wang",
Sex = "男",
};
myFirstResume.SetWorkExperience(new DateTime(2006, 7, 1), new DateTime(2007, 7, 1), "My First Company", "Software Engineer");
Resume mySecondResume = (Resume)myFirstResume.Clone();
mySecondResume.SetWorkExperience(new DateTime(2007, 8, 1), new DateTime(2008, 8, 1), "My Second Company", "Software Engineer");
Resume myThirdResume = (Resume)myFirstResume.Clone();
myThirdResume.SetWorkExperience(new DateTime(2008, 8, 1), new DateTime(2009, 8, 1), "My Third Company", "Senior Software Engineer");
Assert.AreEqual("My First Company", myFirstResume.WorkExperience.Company);
Assert.AreEqual("My Second Company", mySecondResume.WorkExperience.Company);
Assert.AreEqual("My Third Company", myThirdResume.WorkExperience.Company);
}










