由浅拷贝讨论到深拷贝再讨论到接口(二):针对接口编程
继续上篇文章,把一个对象a深拷贝给对象b,我们采用继承ICloneable接口来实现。
(一)有人就要问了:为什么要继承这个接口?我自己写个方法,也能实现深拷贝。
public class Clone
{
//这是一个Framework层级的方法,旨在通用,当传入一个对象时,能返回这个对象的深拷贝.
public object DeepClone(object objA)
{
object objB = new object();
//具体实现仁者见仁智者见智,笔者就不献丑了.
objB = objA;
return objB;
}
}
然后这样调用:
School a = new School();
a.Id = 1;
a.Name = "A school";
a.Student.Name = "Li lei";
Clone clone = new Clone();
School b = (School)clone.DeepClone(a);//深拷贝
完整代码如下:
1 using System;
2
3 namespace NY
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 School a = new School();
10 a.Id = 1;
11 a.Name = "A school";
12 a.Student.Name = "Li lei";
13
14 Clone clone = new Clone();
15 School b = (School)clone.DeepClone(a);//深拷贝
16 }
17 }
18
19 public class Clone
20 {
21 //这是一个Framework层级的方法,旨在通用,当传入一个对象时,能返回这个对象的深拷贝.
22 public object DeepClone(object objA)
23 {
24 object objB = new object();
25 //具体实现仁者见仁智者见智,笔者就不献丑了.
26 objB = objA;
27 return objB;
28 }
29 }
30
31 public class School
32 {
33 public int Id { get; set; }
34 public string Name { get; set; }
35 public Student Student { get; set; }
36
37 public School()
38 {
39 this.Student = new Student();
40 }
41 }
42
43 public class Student
44 {
45 public string Name { get; set; }
46 }
47 }
48
最后,Clone类编写者发出邮件:
早上好!我在Framework层新增了Clone类,里面有个方法是DeepClone,实现了深拷贝。
大家调用的很欢快,一切看上去其乐融融。
(二)针对接口编程,可以解决依赖性等待。
继续上例,由alex担任前台编写,michael担任Clone类编写。那么,在miclael没写好这个类之前,alex写的这段代码:Clone clone = new Clone();是编译不过的。于是,整个项目miclael成了关键路径,所有人都在等待他的完成才能继续手上的工作。怎么办?针对接口编程。
我们先写好一个接口:
public interface IClone
{
object DeepClone(object objA);
}
然后alex就可以针对接口编程了
School a = new School();
a.Id = 1;
a.Name = "A school";
a.Student.Name = "Li lei";
IClone clone = new Clone();//针对接口编程
School b = (School)clone.DeepClone(a);//深拷贝
michael压力也没那么大了,他可以慢慢开发Clone类
public class Clone : IClone
{
public object DeepClone(object objA)
{
object objB = new object();
//michale窃喜:我慢慢的想~我慢慢的想~
objB = objA;
return objB;
}
}
完整代码如下:
1 using System;
2
3 namespace NY
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 School a = new School();
10 a.Id = 1;
11 a.Name = "A school";
12 a.Student.Name = "Li lei";
13
14 IClone clone = new Clone();//针对接口编程
15 School b = (School)clone.DeepClone(a);//深拷贝
16 }
17 }
18
19 public interface IClone
20 {
21 object DeepClone(object objA);
22 }
23
24 public class Clone : IClone
25 {
26 //这是一个Framework层级的方法,旨在通用,当传入一个对象时,能返回这个对象的深拷贝.
27 public object DeepClone(object objA)
28 {
29 object objB = new object();
30 //michale窃喜:我慢慢的想~我慢慢的想~
31 objB = objA;
32 return objB;
33 }
34 }
35
36 public class School
37 {
38 public int Id { get; set; }
39 public string Name { get; set; }
40 public Student Student { get; set; }
41
42 public School()
43 {
44 this.Student = new Student();
45 }
46 }
47
48 public class Student
49 {
50 public string Name { get; set; }
51 }
52 }
53
大家编写的很欢快,一切又其乐融融。
(三)针对接口编程,可以实现松耦合--对修改关闭对扩展开放。
我们的产品终于销售出去了,可是好景不长,A客户对我们的产品很满意,可是B客户却有着自己的特殊要求,使得我们不得不改造DeepClone方法。
但,此时,我们很高兴,因为我们不用改造DeepClone方法,那么,怎么做?
新建个类CloneForB,实现IClone接口。
public class CloneForB : IClone
{
public object DeepClone(object objA)
{
object objB = new object();
objB = objA;
return objB;
}
}
alex部分的代码修改如下:
IClone clone = GetClone();//针对接口编程
private static IClone GetClone()
{
if(...) return new Clone();
if(...) return new CloneForB();
}
完整代码如下:
1 using System;
2
3 namespace NY
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 School a = new School();
10 a.Id = 1;
11 a.Name = "A school";
12 a.Student.Name = "Li lei";
13
14 IClone clone = GetClone();//针对接口编程
15 School b = (School)clone.DeepClone(a);//深拷贝
16 }
17
18 private static IClone GetClone()
19 {
20 if(...) return new Clone();
21 if(...) return new CloneForB();
22 }
23 }
24
25 public interface IClone
26 {
27 object DeepClone(object objA);
28 }
29
30 public class Clone : IClone
31 {
32 public object DeepClone(object objA)
33 {
34 object objB = new object();
35 objB = objA;
36 return objB;
37 }
38 }
39
40 public class CloneForB : IClone
41 {
42 public object DeepClone(object objA)
43 {
44 object objB = new object();
45 objB = objA;
46 return objB;
47 }
48
49 }
50
51 public class School
52 {
53 public int Id { get; set; }
54 public string Name { get; set; }
55 public Student Student { get; set; }
56
57 public School()
58 {
59 this.Student = new Student();
60 }
61 }
62
63 public class Student
64 {
65 public string Name { get; set; }
66 }
67 }
68
如果是B客户,我们就跳到了为B客户新写的类中,这样,就避免了原来的Clone类遭到破坏。
(四)恭喜你!你已经一步步被笔者带入了面向对象编程的世界
(1) OOP设计原则--针对接口编程
(2) 设计模式--工厂模式
(五)写在最后
写到这里,笔者陆陆续续收到各位高手对于上篇博文的回复,深受领教,原来实现深拷贝还有那么多种方式。原本还想推荐ICloneable接口的~笔者这篇博文的目的:介绍针对接口编程,已经完成了,那么就此而止吧。但,笔者会有后续博文,为大家介绍其他实现深拷贝的方式,敬请期待!