日期:2014-05-18  浏览次数:20838 次

请问一下有一个对象, 怎样复制他呢, 而不是获得对象的引用
比如有一个Class 
Class A = A.new()
怎样获取一个A的拷贝呢??


------解决方案--------------------
让对象自己实现 ICloneable 方法,调用之。

或者序列化/反序列化复制一个。

也可以反射递归获取。

但是无论什么方法都不如第一个方法——如何深复制对象是对象设计者才应该知道的事情。
------解决方案--------------------
通过序列化然后反序列化是非常好的方法,操作简单。
------解决方案--------------------
实现 ICloneable接口的Clone()方法,就可以实现深度拷贝
------解决方案--------------------
我赞成使用ICloneable 复制,
序列化/反序列虽然简单,但有些地方不方便

深复制时需要注意的是里面的成员也要实现ICloneable 接口,
如:
ClassA里面有个ClassB类型成员:
class ClassA:ICloneable 
{
public ClassB ClsB { get; set; }
//...
}
ClassB也要实现ICloneable 接口
class ClassB:ICloneable 
{
//...
}
------解决方案--------------------
顺便说下,关于序列化和ICloneable的设计准则:

如果一个类包含了非简单类型的成员,并且这个成员没有实现序列化/ICloneable,那么无论如何这个类也不应该实现序列化/ICloneable。
------解决方案--------------------
1楼caozhy 这句话:"如何深复制对象是对象设计者才应该知道的事情"说出了本质.

2楼的序列化/反序列化,有不适用的地方,例如一些无法序列化的对象,例如已经Open的Connection这个时候是无法通过序列化达到效果.

"
比如有一个Class
Class A = A.new()
怎样获取一个A的拷贝呢??
"
需要一个A的深度克隆,那应该由A类来实现ICloneable接口,然后提供.Clone方法.
具体什么叫A类的深度克隆,需要设计A类的人来描述清晰.