面向对象语言概论(一)
本书是我们上面向对象类型理论的教材。当时上这门课时,心里满不以为然,觉得自己的 C++和OO已经颇有造纸,C++和Java的类型系统不说倒背如流,也是轻车熟路,上这么一门课 不是白拿学分?哈哈! 但一上起来,才发现自己竟如井底之蛙一样。老天,原来就这 么简单的面向对象竟有这么多说道!原来除了C++, Java, 面向对象还有这么多没见过甚至没 想过的东西! 前几章概论,勉强还都搞定了。但后面上到类型系统的建模,subject reduction的证明,就发现自己就象回到了本科时代,这,这,这怎么都是数学啊! 这两天心血来潮。就想把它翻译一下。后面艰深的地方自觉功力太浅,就不不自量力了。不 过,倒可以把前面几章的概论翻译一下,如果能起到帮助大家开阔眼界的作用,也就没白费 劲。 第二章,基于类的面向对象语言 基于类的面向对象语言是面向对象世界 里的主流。它包括: Simula, 第一个面向对象语言 Smalltalk, 第一个支持动 态类型的语言 C++, 它的大部分基于类的特性继承自Simula. 等等等等。 与基于类的语言相对应的是基于对象的面向对象语言。这里“基于对象” 的概念和把Visual Basic叫做基于对象的概念是不同的。这里的“基于对象”是 指一个只以对象为中心,没有类的概念的语言,类似Python之类的语言。 现在,我们 来介绍一下基于类的面向对象语言的一些共同特征。 1.类和对象 让我们先看 一个类的定义:
一个类是用来描述所有属于这个类的对象的共同结构的。这个cell类表 示的对象拥有一个叫做contents的整数属性(attribute),这个属性被初始化成0。它还描述 了两个操作contents的方法。Get和set. 这两个方法的内容都是很直观的。Self变量表示这 个对象自己。 对象的动态语义可以这样理解: 一个对象在内部被表示为一个 指向一组属性的指针。任何对这个对象的操作都会经过这个指针操作对象的属性和方法。而 当对象被赋值或被当作参数传递的时候,所传递的只是指针,这样一来,同一组属性就可以 被共享。 (注, 有些语言如C++, 明确区分指向属性组的指针和属性组本身,而一些 其它的语言则隐藏了这种区别) 对象可以用new从一个类中实例化。准确地说,new C 分配了一组属性, 并返回指向这组属性的指针。这组属性被赋予了初始值,并包括了 类C所定义的方法的代码。 下面我们来考虑类型。对一个new C所生成的对象,我们把 它的类型记为InstanceTypeOf(c). 一个例子是:
这里,通过引入InstanceTypeOf (cell), 我们开始把class和type区分开来了。我们也可以把cell本身当作是类型,但接下来 ,你就会发现,那样做会导致混淆的。 2.方法解析。(Method Lookup) 给出 一个方法的调用o.m(……), 一个由各个语言自己实现的叫做方法解析的过程负 责找到正确的方法的代码。(译者按:是不是想起了vtable了?)。 直观地看,方法 的代码可以被嵌入各个单个对象中,而且,对于许多面向对象语言,对属性和方法的相似的 语法,也确实给人这种印象。 不过,考虑到节省空间,很少有语言这样实现。比较普 遍的方法是,语言会生成许多method suite, 而这些method suite可以被同一个类的对象们 所共享。方法解析过程会延着对象内指向method suite的指针找到方法。 在考虑到继 承的情况,方法解析会更加复杂化。Method suite也许会被组成一个树,而对一个方法的解 析也许要查找一系列method suite. 而如果有多继承的话,method suite甚至可能组成有向 图,或者是环。 方法解析可能发生在编译时,也可能发生在运行时。 在一些 语言中,方法到底是嵌入对象中的,还是存在于method suite中这种细节,对程序员是无关 紧要的。因为,所有能区分这两种模式的语言特性一般在基于类的面向对象语言中都不被支 持。 比如说,方法并不能象属性一样从对象中取出来当作函数使用。方法也不能象属 性一样在对象中被更新。(也就是说,你更新了一个对象的方法,而同一个类的其它对象的该 方法保持不变。) 3. 子类和继承 (Subclassing and Inheritance) 子类和 一般的类一样,也是用来描述对象的结构的。但是,它是通过继承其它类的结构来渐进式地 实现这个目的。 父类的属性会被隐式地复制到子类,子类也可以添加新的属性。在一 些语言中,子类甚至可以override父类的属性(通过更改属性的类型来实现) 父类中 的方法可以被复制到子类,也可以被子类override. 一个子类的代码的示例如下:
对有subclass的方法解析,根据语言是静态类型还是动态类型而有所不 同。 在静态类型的语言(如C++, Java)里,父类,子类的method suite的拓扑结构 在编译时就已经确定,所以可以把父类的method suite里的方法合并到子类的method suite 中去,方法解析时就不用再搜索这个method suite的树或图了。(译者按:C++的vtable就是 这种方法) 而对于动态类型的语言,(也就是说,父子类的关系是在运行时决定的) ,method suite就无法合并了。所以,方法解析时,就要沿着这个动态生成的树或有向图搜 索直到找到合适的方法。而如果语言支持多继承,这个搜索就更复杂了。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |