架构应该解决好对象的克隆问题
克隆的问题是程序开发中遇到的很基础的问题,一旦涉及,就会占用开发人员很多精力。应该在架构中统一解决
IClone 接口有坑。但有的实现还依赖它。所以去除还是去除不掉。 但可以自行实现去除这个依赖。
系统应该提供三个函数:
DeepClone<T>(this T obj) where T: class
ShallowClone<T>(this T obj) where T: class
CopyTo<T>(object source, T toEntity)
DeepClone 是深克隆。使用 MemoryStream + BinaryFormatter ,这种方式依赖: Serializable 特性,但是性能较快。可以检测。
ShallowClone 是浅克隆。使用反射调用: MemberwiseClone 方式, 不明白为什么 MemberwiseClone 是 protected 的,而不是 public 的。
CopyTo 是按字段值使用反射方式进行复制。
当反射成为唯一的方式的时候,也就无从选择了。还好 .Net 有 Emit ,可以用在基础库实现中(开发成本大,但一次投入,重复利用)。
1. 系统要提供深克隆,浅克隆两种方式,去除 IClone 接口。
IClone接口有很多问题, 如基类实现了克隆接口后, 子类不实现就有问题: http://www.cnblogs.com/newsea/archive/2012/09/07/2674425.html
2. 基类拷贝构造函数
如:
public class 生物 { pubic string Type { get; set; } public int Height { get; set ; } } public class 人:生物 { public string Sex { get; set; } } public class 花:生物 { public string Color { get; set; } } 生物 sw = FindOne(); if( sw.Type == "人") { var ren = new 人( sw) ; } else { var hua = new 花(sw ) ; }
而这个基类拷贝构造函数的功能,应该由系统提供,而不是每个类写一个。 实现浅克隆就可以。 利用之前的 CopyTo 方法
var ren = new 人();
ren = sw.CopyTo(ren);
var hua = new 花();
hua = sw.CopyTo(hua);
3. 深克隆归根到底,就是序列化。
只有能序列化的克隆,才是深克隆。深克隆要选择性能最好的序列化方式。
没有序列化的架构机制,就是耍流氓。
4. 克隆和序列化要解决相到引用的问题
类A引用类B,类B引用类A。
可以检测,当相互引用,自动断掉。
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |