原型模式中的深浅复制

深浅复制

因为MemberwiseClone()方法只能将值类型的字段复制到MemberwiseClone()方法创建的新的副本中,而引用类型的值则不能被复制到副本中,这种复制方式为浅复制,在我们写代码过程中可能会满足不了我们的功能要求。
所以所以前人根据工作经验,结合MemberwiseClone()方法总结出深复制的样本。

怎样从浅复制到深复制

从浅复制到深复制的原理其实很简单,就是将引用类型的字段变成值类型的字段。
下面我讲一下如何将引用类型转换为值类型的字段。
其实原理很简单就是使用MemberwiseClone()方法。我们在被引用的类中调用MemberwiseClone()方法,将该类中的所有值类型字段复制到MemberwiseClone()创建的副本中。
然后我们在引用类(就是要使用被引用类中字段的类)中创建引用类的实例,将被引用类中所有的字段赋值给引用类中这个新创建的实例,这样我们就将引用型的字段变成了值类型的字段。让后创建一个引用类实例,将被引用类的实例赋值给引用类实例。这样被引用类中的字段就变成了引用类中的字段。

从简单赋值到深层赋值实例
被引用类
class WorkExperience:ICloneable 

    {
        private string workDate;
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }

		//该方法用来克隆被引用类中的所有的值类型字段
        public object  Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }
引用类
class Resume:ICloneable 
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;//用来接收所有被引用类中的值类型字段


        public Resume (string name)
        {
            this.name = name;
            work = new WorkExperience();
        }

//将被引用类中的所有值类型字段赋值给work
        private Resume(WorkExperience work)
        {
            this.work = (WorkExperience ) work.Clone();
        }


        public void SetPersonalInfo(string sex,string age )
        {
            this.sex = sex;
            this.age = age;
        }


        public void SetWorkExperience(string workDate,string company)
        {
            work.WorkDate = workDate;
            work.Company = company;
        }


        public void Display()
        {
            Console.WriteLine("{0} {1} {2}", name, sex, age);
            Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company );
        }

//创建一个引用类obj,然后将被引用类work中所有的字段,全部赋值给引用类obj。
最后将引用类中所有字段赋值给obj,这样引用类就obj就包含了被引用类和引用类中的所有的字段
        public object Clone()
        {
            Resume obj = new Resume(this.work);
            obj.name = this.name;
            obj.sex = this.sex;
            obj.age = this.age;
            return obj;
        }
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值