基于类基于类的面向对象语言是面向对象世界里的主流。它包括:
Simula,第一个面向对象语言
Smalltalk,第一个支持动态类型的语言
C++,它的大部分基于类的特性继承自Simula.等等等等。
与基于类的语言相对应的是基于对象的面向对象语言。这里“基于对象”的概念和把Visual Basic叫做基于对象的概念是不同的。这里的“基于对象”是指一个只以对象为中心,没有类的概念的语言,类似Python之类的语言。
类和对象
先看一个类的定义:
一个类是用来描述所有属于这个类的对象的共同结构的。这个cell类表示的对象拥有一个叫做contents的整数属性(attribute),这个属性被初始化成0。它还描述了两个操作contents的方法。Get和set. 这两个方法的内容都是很直观的。Self变量表示这个对象自己。
对象的动态语义可以这样理解:
一个对象在内部被表示为一个指向一组属性的指针。任何对这个对象的操作都会经过这个指针操作对象的属性和方法。而当对象被赋值或被当作参数传递的时候,所传递的只是指针,这样一来,同一组属性就可以被共享。
(注, 有些语言如C++,明确区分指向属性组的指针和属性组本身,而一些其它的语言则隐藏了这种区别)
对象可以用new从一个类中实例化。准确地说,new C分配了一组属性,并返回指向这组属性的指针。这组属性被赋予了初始值,并包括了类C所定义的方法的代码。
下面来考虑类型。对一个new C所生成的对象,把它的类型记为InstanceTypeOf(c). 一个例子是:
var myCell: InstanceTypeOf( cell ) := new cell;
这里,通过引入InstanceTypeOf(cell),开始把class和type区分开来了。也可以把cell本身当作是类型,但接下来,就会发现,那样做会导致混淆的。
方法解析
方法解析给出一个方法的调用o.m,一个由各个语言自己实现的叫做方法解析的过程负责找到正确的方法的代码。(者按:是不是想起了vtable了?)。
直观地看,方法的代码可以被嵌入各个单个对象中,而且,对于许多面向对象语言,对属性和方法的相似的语法,也确实给人这种印象。
不过,考虑到节省空间,很少有语言这样实现。比较普遍的方法是,语言会生成许多method suite,而这些method suite可以被同一个类的对象们所共享。方法解析过程会延着对象内指向method suite的指针找到方法。
在考虑到继承的情况,方法解析会更加复杂化。Method suite也许会被组成一个树,而对一个方法的解析也许要查找一系列method suite. 而如果有多继承的话,method suite甚至可能组成有向图,或者是环。
方法解析可能发生在编译时,也可能发生在运行时。
在一些语言中,方法到底是嵌入对象中的,还是存在于method suite中这种细节,对程序员是无关紧要的。因为,所有能区分这两种模式的语言特性一般在基于类的面向对象语言中都不被支持。
比如说,方法并不能象属性一样从对象中取出来当作函数使用。方法也不能象属性一样在对象中被更新。(也就是说,更新了一个对象的方法,而同一个类的其它对象的该方法保持不变。)
----软件开发公司----