谈到继承,不得不谈到封装。
1.为什么会出现封装?
如果我们把整个世界看成是由无数对象组成的大环境,那么,对象是指什么呢?其实际上指任何的一个东西,东西分门别类,比如:男人,女人,正方形,长方形,圆形等,我们为了描述一个对象,需要把对象的属性单独划分出来,这里对像的属性就是指类。属性包含固有的属性和一般的行为,比如:男人有性别,年龄等,这是固有的属性;同样男人可以工作等,这是行为;我们把这种固有的属性和行为在程序中表示就是成员变量和方法。所以封装是根据现实中的实际情况演化而来,只不过用语言去表达而已。
2.为什么会出现private,protected,public修辞符。
成员变量可以在本类中使用,也可以提供给外界使用。以数据封装的目的而言,前者较妥。但有时候不得不开放给外界使用,在这样的情况下就出现private,protected,public修辞符。也是后面我们要提到的派生类。
3.基类与派生类
注明:派生类与基类是iskindof的关系,那Ellipse是一种shape,Circle也是属于一种Ellipse等;
我们将圆形,三角形,矩形等共有的东西抽像出来,形成基类,我们让基类做一件事情,可以设置yan色
让派生类显示各自的信息。为了问题的说明,我们以Console为例演示:
通过以上,我们可以弄清楚:
1.每个派生类都拥有暗属性和方法,即属性和方法在派生类本身中没有体现,是基类的,所以我们称暗属性和方法。
2.rect1和rect2是两个不同的对象,各有自己的成员变量m_color,但却有共享的一个方法setcolor,实际上是基类的setcolor,如图所示:
3.即然所有的类都有相同的方法display(),我们能提到基类中吗?不能,因为display应该因不同的情状而有所变化。
4.形状类我们能实例化吗?形状是一种抽象的东东,世界上并没有形状这种东东,语言是从生活中来的,所以形状类我们不能进行实例化,因为没意义。这也说明了把display()方法放到基类中不适合。。这也是为什么我们后面要谈到的抽象类不能实例化的原理。
5.我们看到了,几乎每个派生类中都有display(),我能否把它放到基类中,至于派生类想实现什么样都可由派生类自己决定呢?答案是:可以,这就是虚函数。下一章节我们继续,如果大家觉得有什么意见或建议,请即时留言。
调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述 ,其元数据也是存储在Assembly中,关于元数据,Assembly,反射我将专门抽一个章节来讲述。(等这个系列讲完后)