架构应该解决好对象的克隆问题

克隆的问题是程序开发中遇到的很基础的问题,一旦涉及,就会占用开发人员很多精力。应该在架构中统一解决

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。

可以检测,当相互引用,自动断掉。

 

posted @ 2016-05-25 13:40  NewSea  阅读(343)  评论(0编辑  收藏  举报