计算机二级C++辅导:面向对象语言概论(一)[1]

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/06 08:52:49 计算机应用能力考试
计算机二级C++辅导:面向对象语言概论(一)[1]计算机应用能力考试
【网络综合 - 计算机应用能力考试】
本书是我们上面向对象类型理论的教材。当时上这门课时,心里满不以为然,觉得自己的C++和OO已经颇有造纸,C++和Java的类型系统不说倒背如流,也是轻车熟路,上这么一门课不是白拿学分?哈哈!
  但一上起来,才发现自己竟如井底之蛙一样。老天,原来就这么简单的面向对象竟有这么多说道!原来除了C++, Java, 面向对象还有这么多没见过甚至没想过的东西!
  前几章概论,勉强还都搞定了。但后面上到类型系统的建模,subject reduction的证明,就发现自己就象回到了本科时代,这,这,这怎么都是数学啊!
  这两天心血来潮。就想把它翻译一下。后面艰深的地方自觉功力太浅,就不不自量力了。不过,倒可以把前面几章的概论翻译一下,如果能起到帮助大家开阔眼界的作用,也就没白费劲。
  第二章,基于类的面向对象语言
  基于类的面向对象语言是面向对象世界里的主流。它包括:
  Simula, 第一个面向对象语言
  Smalltalk, 第一个支持动态类型的语言
  C++, 它的大部分基于类的特性继承自Simula.与基于类的语言相对应的是基于对象的面向对象语言。这里“基于对象”的概念和把Visual Basic叫做基于对象的概念是不同的。这里的“基于对象”是指一个只以对象为中心,没有类的概念的语言,类似Python之类的语言。
  现在,我们来介绍一下基于类的面向对象语言的一些共同特征。
  1.类和对象
  让我们先看一个类的定义:
  class cell is
  var contents: Integer :=0;
  method get(): Integer is
  return self.contents;
  end;
  method set(n:Integer) is
  self.contents := n;
  end;
  end;
  一个类是用来描述所有属于这个类的对象的共同结构的。这个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本身当作是类型,但接下来,你就会发现,那样做会导致混淆的。
  2.方法解析。(Method Lookup)
  给出一个方法的调用o.m(……), 一个由各个语言自己实现的叫做方法解析的过程负责找到正确的方法的代码。(译者按:是不是想起了vtable了?)。
  直观地看,方法的代码可以被嵌入各个单个对象中,而且,对于许多面向对象语言,对属性和方法的相似的语法,也确实给人这种印象。
  不过,考虑到节省空间,很少有语言这样实现。比较普遍的方法是,语言会生成许多method suite, 而这些method suite可以被同一个类的对象们所共享。方法解析过程会延着对象内指向method suite的指针找到方法。
  在考虑到继承的情况,方法解析会更加复杂化。Method suite也许会被组成一个树,而对一个方法的解析也许要查找一系列method suite. 而如果有多继承的话,method suite甚至可能组成有向图,或者是环。
  方法解析可能发生在编译时,也可能发生在运行时。
  在一些语言中,方法到底是嵌入对象中的,还是存在于method suite中这种细节,对程序员是无关紧要的。因为,所有能区分这两种模式的语言特性一般在基于类的面向对象语言中都计算机应用能力考试