使用下面的深度复制代码;
public class Content
{
public int Val;
}
public class Cloner:ICloneable
{
public Content MyContent=new Content();
public Cloner(int newVal)
{
MyContent.Val=newVal;
}
public object Clone()
{
Cloner clonerCloner=new Cloner(MyContent.Val);
return clonerCloner;
}
}
其中使用包含在源Cloner对象中的Content对象(MyContent)的Val字段,创建一个新Cloner对象。这个字段是一个值类型,所以不需要深度复制
使用下面的代码测试:
Cloner mySource = new Cloner(5);
Cloner mytarget = (Cloner)mySource.GetCopy();
Console.WriteLine("myTarget.MyContent.Val={0}", mytarget.MyContent.Val);
mySource.MyContent.Val = 2;
Console.WriteLine("myTarget.MyContent.Val={0}", mytarget.MyContent.Val);
得到如下结果:
myTarget.MyContent.Val=5
myTarget.MyContent.Val=5
这次包含的对象是独立的。注意有时在比较复杂的对象系统中,调用Clone()是一个递归过程。如,如果Cloner类的MyContent字段也需要深度复制,就要使用下面的代码:
(这句话要怎么理解,Cloner类的MyContent字段也需要深度复制,上面不是已经对MyContent进行了深度复制么,为什么调用Clone()是一个递归过程?)
public class Cloner:ICloneable
{
public Content MyContent=new Content();
...
public object Clone()
{
Cloner clonerCloner=new Cloner();
clonerCloner.MyContent=MyContent.Clone();
return clonerCloner;
}
}
这里调用了默认的构造函数,以便简化创建一个新Cloner对象的语法。为使这段代码能正常工作,还需要在Content类上实现ICloneable接口(能否帮忙给出在Content类上实现IConeable的代码)
慕标5832272
一只甜甜圈