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(); } /// /// 通过ICloneable...stream.Position = 0; return formatter.Deserialize(stream) as Sheep; } } 原型模式参与者: ICloneable
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(); return p; } object ICloneable.Clone
这里,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
下面是使用C#编写的一个原型模式实例:using System;public class Person : ICloneable{ public string Name { get; set; }...: John, 30 Console.WriteLine(person2); // Output: John, 31 }}以上代码运行结果如下:图片在这个例子中,Person类实现ICloneable
.Id); Console.ReadKey(); } } 2、C#语言提供的 Clone 方法 C# 中要想能够实现克隆的类,必须实现一个标识接口 ICloneable...public class ConcretePrototypeB : ICloneable { public object Clone() {...{ Console.WriteLine("下载文件,文件名为" + Name); } } public class WeeklyLog : ICloneable.../// /// 抽象公文接口,也可以定义为抽象类 /// public interface IOfficialDocument : ICloneable...{ new IOfficialDocument Clone();//隐藏ICloneable的Clone方法接口 void Display(); }
无论是浅拷贝还是深拷贝,微软都建议用类型继承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
实现 abstract class Prototype : ICloneable { public abstract int X { get; set; }
string; } } /// /// 深拷贝 /// public class DeepClone : ICloneable...数组 类型变化 原对象:{simple.arrString[0]}\t\t 备份对象:{simpleTwo.arrString[0]}"); } } 我们通过继承ICloneable...我们继续将上面的例子进行深拷贝看看: /// /// 深拷贝 /// public class DeepClone : ICloneable
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 称为接口
= 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
领取专属 10元无门槛券
手把手带您无忧上云