浅复制与深复制

      在设计模式中介绍了原型模式,对原型模式的定义是这样的:用原型实例指定创建对象的种类,并且通过拷
贝这些原型创建新的对象;说白了就是创建好一个模版然后‘复制’即可
    话说回来,以前只知道复制,但是还不知道复制还分深浅呢,下面来讲一下浅复制与深复制
一、提出问题
    当简历类中的字段都是值的时候可以直接复制就行,那么当字段是引用的时候直接复制还可以吗?
    注:引用是类中的方法实现调用另一个类中的数据或方法
    经过小菜的实践得知,当字段为引用时不能对原数据进行复制(这就是浅复制)
      代码如下:
class WorkExperience:ICloneable 
    {
        private string workdate;
        public string WorkDate
        {
            set { workdate = value; }
            get { return workdate; }
        }
        private string company;
        public string Company
        {
            set { company = value; }
            get { return company; }
        }
    }

    class Resume :ICloneable 
    {
        private string name;
        private string sex;
        private string age;
        //建立work,引用‘工作经历’
        private WorkExperience work;
        public Resume(string name)
        {
            this.name = name;
            work =new WorkExperience ();
        }

        public void SetExperience(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);
        }

        public Object Clone()
        {
            //克隆
            return (Object)this.MemberwiseClone();
        }
    }
<pre name="code" class="csharp">class Program
    {
        static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetExperience("男", "22");
            a.SetWorkExperience("2012-2014", "XX公司");

            Resume b = (Resume)a.Clone();
            //b.SetExperience("女", "21");
            b.SetWorkExperience("2013-2014", "YY公司");

            a.DisPlay();
            b.DisPlay();
            Console.Read();
        }
    }
 
     分析:主程序把数据赋值给引用,引用会随着数据的变化而变化,直到最后一次的设置,在简历类中仅仅
是对引用进行克隆,所以在最终两条结果都显示为最后一次设置
    那么我们该如何做到深复制呢?
二、解决方法
    要做到深复制,那就要直接复制工作经历中的数据,即在工作经历类中实现克隆方法,并且在简历类中调
用以便克隆数据,这样就可以把原数据和引用全都复制,做到了深复制
     
     
     这样就可实现深复制
三、比较
    浅复制:因为浅复制只是复制的引用,引用是指向特定的对象的,那么原模型和复制后的对象就有了联系
在改变原模型后引用也会发生变化。
    深复制:它不仅复制了引用而且还有对象本身,这样就可以做到复制后的对象不随原数据的变化而变化。
四、总结
    利用原型模式可以很好的简化代码,优化代码,减少内存的负担
    做好学习的总结很重要,也许你在看的时候有一些不明白的,但是在做总结的过程中通过查资料,会越来
越明白。。



评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值