Console.WriteLine(re1.Name); Console.ReadKey();三、简化的原型模式 public class Resume2:ICloneable res2 .ShowResume();//值类型,res2发生了变化;引用类型,全部发生变化 public class Experience:ICloneable return this.MemberwiseClone(); } } public class Resume3 : ICloneable this.Exp.TimeArea}{this.Exp.Company}"); } }五、(伪)深拷贝真正的深拷贝要用反射、序列化 public class Resume3 : ICloneable
C#例子
[Serializable]
public class Sheep : ICloneable
{
public string Name { get; set this.Name = name;
Children = new List<Sheep>();
}
///
class Shape: ICloneable { object ICloneable.Clone( ) {…} } class Ellipse: Shape { object ICloneable.Clone ( ) {…} } 在Ellipse 中定义ICloneable.Clone是错误的,因为Ellipse即使隐式地实现了接口ICloneable,ICloneable仍然没有显式地出现在Ellipse 例如: interface ICloneable { object Clone( ) ; } class C: ICloneable { object ICloneable.Clone( ) class Shape: ICloneable { object ICloneable.Clone( ) {…} } class Ellipse: Shape { object ICloneable.Clone 例如: interface ICloneable { object Clone( ) ; } class C: ICloneable { object ICloneable.Clone( )
这种情况下使用原型模式非常便捷: 我们让这个类去实现ICloneable接口,并且实现该接口的clone()函数,在clone函数中让当前对象进行一次浅拷贝/深拷贝,总之就是克隆一个当前对象来,这样我们就无需 如果一个类要使得调用者能够克隆,那在定义这个类的时候就需要让它实现ICloneable接口,并实现clone函数,在函数中实现当前对象的浅拷贝或深拷贝。 由于Person类也实现了ICloneable接口,并且clone函数也进行了一样的操作,调用Work类的clone函数,由于Work类中全都是基本数据类型,所以Work类不需要实现ICloneable
当然,ICloneable接口只提供了一个声明为Clone的方法,我们可以根据需求在Clone方法内实现浅拷贝或深拷贝。 int Age {get;set; } public Department Department{get;set;} #region ICloneable成员 一个简单的深拷贝实现样例如下(建议使用序列化的形式来进行深拷贝) class Employee:ICloneable { public string IDCode{get;set;} public int Age{get;set;} public Department Department{get;set;} #region ICloneable成员 public Em-ployee的最终版本看起来应该像如下的形式: [Serializable]class Employee:ICloneable{ public string IDCode{get;set;
ref _provinceOrgs); } } } 实体类: public class ProvinceOrg : ICloneable ; p.children = new List<ProvinceOrg>(); return p; } object ICloneable.Clone
当然,ICloneable接口只提供了一个声明为Clone的方法,我们可以根据需求在Clone方法内实现浅拷贝或深拷贝。 int Age {get;set; } public Department Department{get;set;} #region ICloneable成员 一个简单的深拷贝实现样例如下(建议使用序列化的形式来进行深拷贝) class Employee:ICloneable { public string IDCode{get;set;} public int Age{get;set;} public Department Department{get;set;} #region ICloneable成员 public Em-ployee的最终版本看起来应该像如下的形式: [Serializable]class Employee:ICloneable{ public string IDCode{get;set;
这里,Object相当于抽象原型类,而所有实现了ICloneable接口的类都相当于具体原型类。 public class WeeklyLog : ICloneable { public string Name { get; set; } public string 再来看看深复制的实现: [Serializable] public class WeeklyLog : ICloneable { public string Name (1)抽象原型与具体原型 public interface OfficeDocument : ICloneable { new OfficeDocument Clone( ); // 隐藏ICloneable的Clone接口方法定义 void Display(); } public class FAR : OfficeDocument
.Id);
Console.ReadKey();
}
}
2、C#语言提供的 Clone 方法
C# 中要想能够实现克隆的类,必须实现一个标识接口 ICloneable public class ConcretePrototypeB : ICloneable
{
public object Clone()
{ {
Console.WriteLine("下载文件,文件名为" + Name);
}
}
public class WeeklyLog : ICloneable ///
下面是使用C#编写的一个原型模式实例:using System;public class Person : ICloneable{ public string Name { get; set; } : John, 30 Console.WriteLine(person2); // Output: John, 31 }}以上代码运行结果如下:图片在这个例子中,Person类实现ICloneable
无论是浅拷贝还是深拷贝,微软都建议用类型继承ICloneable接口的方式明确告诉调用者:该类型可以被拷贝。 当然,ICloneable接口只提供了一个声明为Clone的方法,我们可根据需求在Clone方法内实现浅拷贝或深拷贝。 一个简答的浅拷贝的实现代码如下所示: 首先定义实体类: public class Employee:ICloneable { public string IDCode { 由于接口ICloneable,只有一个模棱两可的方法,所以,如果要在一个类中进行浅拷贝和深拷贝,只能由我们额外的实现两个方法。声明为DeepClone和Shallow。 那么最终代码如下所示: [Serializable] public class Employee:ICloneable { public string IDCode
Console.WriteLine("{0}'s age is {1}", Name, Age); } } class Enrollment : ICloneable Console.WriteLine("{0}'s age is {1}", Name, Age); } } class Enrollment : ICloneable
string;
}
}
///
1 class Shape: ICloneable 2 3 { 4 5 object ICloneable.Clone( ) {…} 6 7 } 8 9 class Ellipse : Shape 10 11 { 12 13 object ICloneable.Clone( ) {…} 14 15 } 在Ellipse 中定义ICloneable.Clone是错误的,因为 Ellipse即使隐式地实现了接口ICloneable,ICloneable仍然没有显式地出现在Ellipse定义的基类列表中。 例如: 1 interface ICloneable { 2 3 object Clone( ) ; 4 5 } 6 7 class C: ICloneable { 8 9 object ICloneable.Clone( ) {…} 10 11 public object Clone( ) {…} 12 13 } 例子中成员ICloneable.Clone 称为接口
实现 abstract class Prototype : ICloneable { public abstract int X { get; set; }
= null) { if (value is ICloneable) { pro.SetValue(target, (value as ICloneable).Clone(), null); } Object fieldValue = field.GetValue(obj); if (fieldValue is ICloneable { field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable object propertyValue = myProperty.GetValue(obj, null); if (propertyValue is ICloneable
接下来我们看一下如何让一个对象可被克隆: class prototypeClass : ICloneable { public prototypeClass(string classname) set; } public void ShowName() { Console.WriteLine(classname); } } 具体的逻辑就是让原型类实现ICloneable
3.对象克隆 一个类必须自己确定是否允许被克隆,如果允许则应该实现IConeable接口,该接口定义一个方法Clone方法,实现该方法如下: class myConle : ICloneable {
浅复制: 实现浅复制需要使用Object类的MemberwiseClone方法用于创建一个浅表副本 深复制: 须实现 ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable ]特性 namespace DeepCopy { class DrawBase : System.Object, ICloneable { public List<string
ConcretePrototype1("I"); ConcretePrototype1 c1 = new (ConcretePrototype1)p1.Clone(); } 对于.NET而言, 在System命名空间中提供了ICloneable