因为类的实例是引用类型,要想用原有的类中的实例的数据的话,既要想创建原对象的一个副本的话,只能用clone方法。
Clone方法分为深clone和浅clone
在C#中提供了浅clone的方法,即为MemberwiseClone()
C#浅Clone的例子:
using System;
namespace DesignPattern
{
public class ToolbarButton : ICloneable //实现Clone接口
{
private int _Width;
private int _Height;
public ToolbarButton()
{ }
public int Width
{
get
{
return _Width;
}
set
{
_Width=value;
}
}
public int Height
{
get
{
return _Height;
}
set
{
_Height=value;
}
}
public object Clone()
{
return this.MemberwiseClone(); //返回浅clone方法¨
}
}
public class Test
{
public void TestMethod()
{
ToolbarButton mtb_NewButton=new ToolbarButton();
mtb_NewButton.Width=60;
mtb_NewButton.Height=30;
ToolbarButton mtb_SaveButton=new ToolbarButton();
mtb_SaveButton=(ToolbarButton)mtb_NewButton.Clone();
//这时mtb_SaveButton就有Width和Height的值了
}
}
}
以上是一个浅clone方法
MemberwiseClone()方法执行的只是浅层拷贝。而深层拷贝要递归的拷贝其字段所引用的所有对象。
public class DeepClone : System.ICloneable
{
Person g;
Person b;
public Object Clone()
{
DeepClone dc = (DeepClone)this.MemberwiseClone();
dc.g = (Person)(this.g.Clone());
dc.b = (Person)(this.b.Clone());
return dc;
}
}