继续唠叨,我写这个系列,好像写流水账或小说一样。今天有点忙,有点累,让我静下来的就是在电脑旁看代码。
Fuck,坏心情!妈的,我31了,每天起床,上班,下班,看代码,与自己对话,孤独的只剩下灵魂和思想了。想想别人开房是和女朋友,我去开房是带着电脑写代码!日!我就是个疯子!不扯了,日子还要过,我还需要积极上进!(请原谅我的激进及愤世嫉俗!)
今天说原型模式。原型在JS语言中是个很重要很难理解的东西。其实归根到底不好理解的就是指针(定义一个变量,编译器知道变量的地址,妈的我是程序员竟然不知道,好吧,再定义一个变量,专一存这个变量的地址)。在面向对象中,把地址放到了栈中,堆中才有对象。这是理解JS中原型的基础。
我们来扯面向对象中的原型:
首先一个对象是有很多成员组成的(静态的,动态的【字段,属性,方法了,事件等】),原型模式也是创建型模式。大家都知道开始学面向对象的时候,类相当于一个磨具,对象是用这个磨具生成的实在的东西。原型相当于类(类某种意义上也是对象,因为也要占空间),创建对象,最方面的就是先复制出来一个,再修修改改。
2:再说拷贝,分为浅拷贝,和深拷贝,但是要记住不管是浅或深,都是对成员来说的,即拷贝的是成员。
浅拷贝,意思是拷贝成员的时候,如果成员是引用类型,只把引用拷贝一份,其引用的堆地址共享。深拷贝意思是对引用类型来说,拷贝栈中的引用,同时把堆中的数据也拷贝一份新开辟一个空间(既然开辟新的内存,其栈中的地址肯定要变的)。【备注:字符串虽然是引用类型,但是当值类型使用】
开始上例子了【一样是别人的例子,我来解释:(备注归我所有,源码归原作者所有)】
//实现拷贝接口,这个接口只是定义一个可以快速创造另外对象的方法,至于是深拷贝,还是浅拷贝,没有具体说。看实现
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();
}
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);
}
//此处实现的时深拷贝
public Object Clone()
{
//new 的时新实例(实例包括堆,和栈的数据,对象只是堆的数据)
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}
Resume a = new Resume("大鸟");
a.SetPersonalInfo("男", "29");
a.SetWorkExperience("1998-2000", "XX公司");
Resume b = (Resume)a.Clone();
b.SetWorkExperience("1998-2006", "YY企业");
Resume c = (Resume)a.Clone();
c.SetWorkExperience("1998-2003", "ZZ企业");
a.Display();
b.Display();
c.Display();