学库吧 > 软件设计师 > 正文

软件设计师知识点:面向对象语言概论(三) 软件设计

更新:2008-09-22 整理:www.xuekuba.com
字体:

[软件设计师面向对象知识点:面向对象系统的特性]面向对象系统最突出的特性就是封装性、继承性和多态性。衡量某一种程序设计语言,看它是否是面向对象的程序设计语言,主要看它是否具有这三种特性。在这一章中我们将对它们逐个地进行分析。3.1 封 装 性3.1.1 什么是封装从字面上理解,封装就是将某事物包围起来,使外界不知道其实际内容。在程序设计中,封装是指将一个数据和与这个数据有关的作集合放在一起,形成一个能动的实体 ---- 对象......+阅读

软件设计师知识点:面向对象语言概论(三)

传统的基于类的面向对象语言的一个主要特点就是inheritance, subclassing和subtyping之间的密不可分的联系。很多的面向对象语言的语法,概念,就是从这三者而来的。比如说,通过subclassing, 你可以继承父类的一些方法,而同时你又可以在子类中改写父类的方法。这个改写过的方法,通过subtyping, subsumption, 又可以从一个类型是父类的对象去调用。
  但是,inheritance, subclassing, subtyping这三者并不是永远和睦相处的。在一些场合,这三者之间的纠缠不清会妨碍到通过继承或泛型得到的代码重用。因此,人们开始注意到把这三者分离开来的可能性。区分subclassing和subtyping已经很常见了。而其它的一些方法还处于研究的阶段。这一章我们将介绍这样一些方法。
  一,对象类型
  在早期的面向对象语言中(如Simula), 类型的定义是和方法的实现是混合在一起的。这种方式违反了我们今天已经被广泛认识到的把实现和规范(Specification) 分离的原则。这种分离得原则在开发是团队进行的时候尤其显得重要。
  更近期一些的语言,通过引入不依赖于实现的对象类型来区分实现和规范。Modula-3以及其它如Ja等的支持class和interface的语言都是采用的这种技术。
  在本书中,我们开始引入InstanceTypeOf(cell)时,它代表的概念相当有限。看上去,它似乎只表示用new cell生成的对象的类型,于是,我们并不能用它来表示从其它类new出来的对象。但后来,当我们引入了subclassing, method overriding, subsumption和dynamic dispatch之后,事情变得不那么简单了。我们的InstanceTypeOf(cell)已经可以用来表示从cell的子类new出来的对象,这些对象可以包括不是cell类定义的属性和方法。
  如此看来,让InstanceTypeOf(cell)依赖于一个具体的类似乎是不合理的。实际上,一个InstanceTypeOf(cell)类型的对象不一定会跟class cell扯上任何关系。
  它和cell类的共同之处只是它具有了所有cell类定义的方法的签名(signature).
  基于这种考虑,我们可以引入对象类型的语法:
  针对cell类和reCell类的定义:
  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;
  subclass reCell of cell is
  var backup: Integer := 0;
  override set(n: Integer) is
  self.backup := self.contents;
  super.set(n);
  end;
  method restore() is
  self.contents := self.backup;
  end;
  end;
  我们可以给出这样的对象类型定义:
  ObjectType Cell is
  var contents: Integer;
  method get(): Integer;
  method set(n:Integer);
  end;
  ObjectType ReCell is
  var contents: Integer;
  var backup: Integer;
  method get(): Integer
  method set(n: Integer);
  method restore();
  end;
  这两个类型的定义包括了所有cell类和reCell类定义的属性和方法的类型,但却并不包括实现。这样,它们就可以被当作与实现细节无关的的接口以实现规范和实现的分离。两个完全无关的类c和c’, 可以具有相同的类型Cell, 而Cell类型的使用者不必关心它使用的是c类还是c’类。
  注意,我们还可以加入额外的类似继承的语法来避免在ReCell里重写Cell里的方法签名。但那只是小节罢了。
  二,分离Subclassing和Subtyping.
  在我们上一章的讨论中,subtype的关系是建立在subclass关系的基础上的。但如果我们想要让type独立于class, 那么我们也需要定义独立于subclass的subtype.
  在定义subtype时,我们又面临着几种选择:subtype是由类型的组成结构决定的呢?还是由名字决定呢?
  由类型的组成结构决定的subtype是这样的:如果类型一具有了类型二的所有需要具备的属性和方法,我们就说类型一是类型二的subtype.
  由类型名字决定的subtype是这样的:只有当类型一具有了类型二的所有需要具备的属性和方法, 并且类型一被明确声明为类型二的subtype时,我们才认可这种关系。
  而如果我们的选择是一,那么那些属性和方法是subtype所必需具备的呢?哪些是可有可无的呢?
  由组成结构决定的subtype能够在分布式环境和object persistence系统下进行类型匹配(译者注:对这点,我也不甚明了。看来,纸造得还是不够)。缺点是,如果两个类型碰巧具有了相同的结构,但实际上却风马牛不相及,那就会造成错误。不过,这种错误是可以用一些技术来避免的。
  相比之下,基于名字的subtype不容易精确定义,而且也不支持基于结构的subtype.
  (译者按,这里,我无论如何和作者找不到同感。基于结构的subtype的缺点是一目了然,不过完美的避免的方法我却看不出来。而基于名字的subtype为什么就不能精确定义呢?C++/Ja/C#, 所有流行的OO语言都只支持基于名字的subtype, 也没有发现有什么不够灵活的地方。需要在不同名字但类似结构的类型之间架桥的话,adapter完全可以胜任嘛!)
  目前,我们可以先定义一个简单的基于结构的subtype关系:
  对两个类型O和O’,
  O’

本文地址:http://www.xuekuba.com/view/13022037.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请给我们来信(willowduanall@hotmail.com),我们会及时处理和回复,谢谢.

类似推荐

软件设计师UML知识点:第六章前言建模实际上是对真实世界进行简化,从而可以更好地理解你要开发的系统。使用UML中基本的建筑块如:类、接口、、协作、组件、依赖、继承等,可以建立你想要的模型。还可以利用第五章介绍的机制扩充UML来表达问题领域独特的东西。图是你这些建筑块的方式。图着一系列的元素,这些元素常常被画成用点(事物)和弧()相连的图。利用图来从不同的视角来观察系统。由于没有一个复杂的系统可以从一个图弄明白,UM...
软件设计师面向对象知识点:类和对象类的实现的基本格式:class 类名 类声明{类体的内容}类体中包括:变量的定义 + 方法的定义。例:class Ladder 类声明{float a,b,h,ladderArea; 定义变量float area() 定义方法{float ladArea;ladArea=(a+b)*h/2.0f;return ladArea;}void setHeight(float newH) 定义方法{h=newH;}}成员变量和部变量成员变量:类体中,变量定义部分所定义的变量。部变量:类体中,方法体定义的变量和方法的参数。成员变量的作用范围:在整个类...
软件设计师UML知识点:第三章类类是具有相同属性、作、的对象集合的总称。通常在UML中类被画成矩形。名称每个类都必须有一个名字,用来分其它的类。类名是一个字符串,称为简单名字。路径名字是在类名前加包含类的包名为前缀。例如Wall、ja::awt::Wall都是合法的类名。属性属性是指类的命名的特性,常常一类取值。类可以有任意多个属性,也可以没有属性。在类图中属性只要写上名字就可以了。如下图也可以在属性名后跟上类型甚至缺省取值,如下图:...
软件设计师面向对象知识点:面向对象方法面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容的作组成的封装体,与客观实体有直接对应,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次的类的属性和作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制...
软件设计师UML知识点:第二章HelloWorld记得在学C语言的时候,教科书上的第一个程序就是叫Hello world,一个在屏幕上简单地打印出“Hello world!”语句的例子。在系统的学UML语言之前我们来看一个简单的例子,让大家有一个系统的认识。在ja中一个在浏览器中显示“Hello World!”的Applet码如下:import ja.awt.Graphics;class HelloWorld extends ja.applet.Applet{public void paint( Graphics g ){g.String(Hello World!, 10,10 );}}码的第一行:import...
软件设计师UML知识点:第五章通用机制UML中的四种机制使地它简单和更易于使用,你可以在UML语言的任何时候用同样的方法来使用,这四种机制是:l specificationsl adornmentsl mon divisionsl extensibility本章讨论adornments和extensibility这两种机制。注释是最重要的一种修饰。一个注释在UML中是一个图形符号,描述了和它相关联的元素或一组元素的或注释语。上图就是一个使用注释的例子,图中右边的为注释符号。UML的扩充性机制允你在控制的方式下扩充UML语言...
软件设计师知识点:面向对象语言概论四四,彻底划清界限(继续分离Subclassing和Subtyping)在第二节我们讨论了部分分离Subclassing和subtyping的方法,即subclassing-implies-subtyping. 现今的多面向对象语言,如Ja, C#都是采用了这种技术。除此之外,还有一种进一步分离Subclassing和subtyping的方法。这种被称作inheritance-is-not-subtyping的方法通过完全割裂subclassing和subtyping之间的而在更大程度上方便了码的。它的产生很大程度上是由于人们想...
软件设计师上午知识点软件计师上午识点分析近三年的考试情况,上午试题的识点分布如表1所示。 表1 近三年上午试题考核内容分布情况 题目编号 考核内容 1-6 计算机基础知识 7-9 10-11 标准化与知识产权 12-14 多媒体技术 15-19 软件开发基础知识 20-22 程序设计语言知识 23-28 作系统基础知识 29-36 软件过程、软件质量管理、文档与软件维护、软件测试 37-47 面向对象技术、UML、设计模式 48-50 程序语言基础知识 51-56 数据库系统基础...
软件设计师面向对象知识点:面向对象系统的特性面向对象系统最突出的特性就是封装性、继承性和多态性。衡量某一种程序设计语言,看它是否是面向对象的程序设计语言,主要看它是否具有这三种特性。在这一章中我们将对它们逐个地进行分析。3.1 封 装 性3.1.1 什么是封装从字面上理解,封装就是将某事物包围起来,使外界不知道其实际内容。在程序设计中,封装是指将一个数据和与这个数据有关的作集合放在一起,形成一个能动的实体 ---- 对象,不必知道对象行为的实现细节...