淺複製的實現和解讀
概念
“淺複製”,被複制對象的所有變量都含有與原來的對象相同的值,
而所有的對其他對象的的引用都任然指向原來的對象
簡歷的淺複製實現
工作經驗
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shallow_copy
{
class WorkExperience
{
private string workDate;
public string WorkDate
{
get
{
return workDate;
}
set
{
workDate = value;
}
}
private string company;
public string Company
{
get { return company; }
set { company = value; }
}
}
}
簡歷
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shallow_copy
{
class Resume:ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience workExperience;
public Resume(string name)
{
this.name = name;
workExperience = new WorkExperience();
}
//設置個人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
}
//設置工作經歷
public void SetWorkExperience(string workDate,string company)
{
workExperience.WorkDate = workDate;
workExperience.Company = company;
}
//顯示
public void DisPlay()
{
Console.WriteLine("{0} {1} {2}",name,sex,age);
Console.WriteLine("工作經歷: {0} {1}",workExperience.WorkDate,workExperience.Company);
}
public object Clone()
{
return (Object)MemberwiseClone();
}
}
}
客戶端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shallow_copy
{
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("強爸爸");
a.SetPersonalInfo("男", "20");
a.SetWorkExperience("1997-2000", "XXX公司");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("1998-2000", "XXX公司");
Resume c = (Resume)a.Clone();
c.SetWorkExperience("1999-2000", "XXX公司");
a.DisPlay();
b.DisPlay();
c.DisPlay();
/*"淺複製",被複制對象的所有變量都含有與原來的對象相同的值,
* 而所有的對其他對象的的引用都任然指向原來的對象
*/
Console.ReadKey();
}
}
}
解讀
**被複制對象的所有變量都含有與原來的對象相同的值:
而所有的對其他對象的引用都仍然指向原來的對象
理解——在Resume簡歷中有這麼一句話 private WorkExperience workExperience
這個就是在Resume簡歷中有對WorkExperience的引用
都指向原來的對象——意爲:在Resume的b和c使用SetWorkExperience都指向原來的對象 也就是a
所以最後c.SetWorkExperience修改結束後 其實修改的都是同一個對象 所以打印結果也會一直
就是由於Clone的Resume中有其他對象(WorkExperience)的引用 所以其實指向的就是同一個對象。