面向对象范型

上传人:新** 文档编号:563721692 上传时间:2022-08-23 格式:DOCX 页数:6 大小:20.26KB
返回 下载 相关 举报
面向对象范型_第1页
第1页 / 共6页
面向对象范型_第2页
第2页 / 共6页
面向对象范型_第3页
第3页 / 共6页
面向对象范型_第4页
第4页 / 共6页
面向对象范型_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《面向对象范型》由会员分享,可在线阅读,更多相关《面向对象范型(6页珍藏版)》请在金锄头文库上搜索。

1、面向对象范型概述面向对象范型以对象概念为中心,一切都集中在对象上。编写代码时是围绕对象而非函 数进行组织的。对象是什么?对象传统上被定义为带有方法(面向对象领域称呼函数的术语)的数据。 糟糕的是,这是一种非常有局限性的对象观。稍后我会给出一个更好的对象定义。我说到对 象的数据时,可能指数值和字符串这样的简单事物,也可能指其他对象。使用对象的优点在于,可以定义自己负责自己的事物(参见表1-2)。对象天生就知道自 己的类型。对象中的数据能够告诉它自己的状态如何,而对象中的代码能够使它正确工作(也 就是说,做要求它做的事情)。表1-2对象及其责任对象责 任Student知道自己所在的教室 知道自己下

2、堂课的教室 从一个教室去下一个教室Instructor告诉学生到下堂课的教室去Classroom有明确地址在这种情况下,对象是通过寻找在问题领域中的实体而被发现的。然后再通过查看这些 实体需要做些什么,为每个对象确定责任(或者称方法)。这与通过在需求中寻找名词发现 对象和通过寻找动词发现方法的技术是一致的。随着所遇到问题更加复杂,我们将看到,这 种技术存在很大局限性,本书中我会给出一种更好的方式。但是现在我们还要从此方式开始 入手。怎么理解对象?理解对象的最佳方式,是将其看成具有责任的东西”。有一条好的设计规则:对象应该 自己负责自己,而且应该清楚地定义责任。这就是我之所以说Student对象

3、的责任之一是知 道怎样从一个教室去下一个教室”的原因。或者,使用Fowler的视角,还可以用Martin Fowler的视角框架来观察对象:使用对象 将责任转移到更局部的层次, 在概念层次上,对象是一组责任;在规约层次上,对象是一组可以被其他对象或对象自己调用的方法(也称行为)。 在实现层次上,对象是代码和数据,以及它们之间的计算交互。糟糕的是,人们对面向对象设计的教学和讨论更多的是停留在实现层次一也就是只考虑 代码和数据,对概念层次和规约层次重视很不够。然而,从后两种层次去思考对象其实也具 有巨大的效力。对象具有供其他对象使用的接口:因为对象具有责任而且自己负责自己,所以必须有办法告诉对象要

4、做什么。对象含有说 明自己状态的数据,还有实现必要功能的方法。对象的很多方法都将标识为可被其他对象调 用。这些方法的集合就称为对象的公开接口 (public interface)。例如,在教室的例子中,我可以编写含有一个gotoNextClassroom()方法的Student对象。我 们不需要向这个方法传递任何参数,因为每个Student对象都自己负责自己。也就是说, Student对象知道:=为了能够找到下一个教室,它需要什么。=怎样为完成这个任务获取所需的其他信息。围绕类组织对象刚开始,只有一种学生一一普通学生需要从一个教室到另一个教室去。请注意,在我们 的教室(我们的系统)中可能有很多

5、这样的“普通学生”。当然可以每个学生都有一个对象对 应,从而能够容易地和分别地跟踪每个学生的状态。但是,要求每个Student对象都有自己 的一组方法,告诉它能做什么和怎样做,显然效率很低,尤其是在对所有学生而言任务都一 样的时候。一种效率更高的办法是,让所有学生与一组方法关联起来,每个学生都可以根据自己的 需要使用或修改这些方法。我希望定义一个“一般学生”来包含这些公共方法的定义。然后, 可以有各种各样特殊的学生,每个特殊学生都必须掌握自己的私有信息。在面向对象术语中,这种“一般学生”被称为类(class)。类就是对对象行为的定义,它 包含以下内容的完整描述:1、对象所包含的数据元素。2、对

6、象能够操作的方法。3、访问这些数据元素和方法的方式。因为对象所包含的数据元素可以不同,所以同一类型的对象可以含有不同数据,但它们 都具有相同的功能(如方法所定义)。对象是类的实例要获得一个对象时,我告诉程序需要某个类型(type,也就是对象所属的类)的一个新 对象,这个新对象称为类的一个实例(instance )。创建类实例的过程称为实例化(instantiation)0 在例子中使用对象使用面向对象方法为“去下堂课教室”的例子编程比以前的方法简单多了。步骤将如下所 示:1开始控制程序。2. 实例化室中学生的集合。3. 告诉此集合,让学生去自己下堂课的教室。4. 集合让每个学生去自己下堂课的教

7、室。5. 每个学生都:a. 找到自己下堂课的教室在哪里;b. 决定怎么去;c. 去那里。6. 完成。抽象类型的需要在需要加入另一个学生类型比如研究生之前,这一方式能够很好地工作。遇到难题了。看起来我们必须允许任何类型的学生(普通学生或者研究生)加入这个集合。 但我们面临的问题是,怎样让集合引用其元素呢?因为我们是在讨论如何用代码实现,这时 集合实际上将是包含某个类型对象的数组或其他容器。如果集合命名为RegularStudent (普 通学生)之类,我们就不能将GraduateStudent (研究生)类型的对象放入集合。如果说集合 仅仅是一组对象,又怎么确定其中不包含类型错误的对象(即不能“

8、去下堂课的教室”)呢?解决方案很直截了当。我需要一个能包容多种具体类型的一般类型。在本例中,我们需 要一个包含RegularStudent对象和GraduateStudent对象的Student类型。在面向对象的术语 中,我们称Student类为抽象类(abstract class)抽象类定义了一组类可以做什么抽象类定义了其他一些相关类的行为。这些“其他”类是代表了某种特殊类型的相关行为 的类。这样的类通常被称为具体类(concrete class),因为它代表着一个概念特定的、不变 的实现。在本例中,Student就是抽象类。具体类RegularStudent和GraduateStudent

9、则代表 了两种类型的 Studento RegularStudent 是一种 Student, GraduateStudent 也是一种 Student0这种关系叫做is-a (是一个/种)关系,是我们称之为继承(inheritance)关系的一种特 例。于是,我们说RegularStudent类继承自Student类。其他类似的说法还有:GraduateStudent 派生自 Student 类,Graduate-Student 特化(specialize)了 Student 类,或者 GraduateStudent 是Student的子类。而另一方面,我们说 Student 类是 Grad

10、uateStudent 类和 RegularStudent 的基类,Student 类泛化(generalize) 了二者,或者 Student 类是 GraduateStudent 类和 RegularStudent 的超类 (superclass)。抽象类可以充当其他类的占位符抽象类可以充当其他类的占位符。可以使用抽象类定义其派生类必须实现的方法。抽象 类还可以包含所有派生类都能够使用的公共方法。派生类是使用抽象类的默认行为还是使 用自己的有所变化的行为,由派生类自己决定(这与对象自己负责自己”的要求一致)。这就意味着,我可以在控制程序中编写一些对象,它们的引用类型都是Student。编译

11、 器能够检查Student引用所指向的是否真的是一种Student。这种机制使我们能够实现鱼与熊 掌兼得,同时获得了三方面的优点:1、集合只需处理Student对象(从而使Instructor对象也只需要处理Student对象)。2、但是类型检查仍然存在(只有能够“去下堂课教室”的Student对象会包含进来)。3、而且每一种Student都可以按自己的方式实现功能。抽象类不只是不能实例化抽象类经常被描述为“不能实例化的类”。这个定义本身没错在实现层次上。但是局 限性太大了。在概念层次上定义抽象类会更有帮助。在概念层次,抽象类就是(实现抽象类 所代表的概念的)其他类的占位符。也就是说,抽象类为

12、我们提供了一种方法,能够给一组相关的类赋予一个名字。这使我 们能够将这一组相关类看成一个概念。在面向对象范型中,必须总是从概念、规约和实现所有三个视角层次来思考问题。可见性因为对象都自己负责自己,所以有很多东西不需要暴露给其他对象。前面我们曾提到公 开接口可以被其他对象访问的方法的概念。在面向对象系统中,可访问性主要分为以下 几种类型:公开(public)任何对象都能够看见。保护(protected)只有这个类及其派生类的对象能够看见。私有(private)只有这个类的对象能够看见。这就引出了封装(encapsulation)的概念。封装经常被简单地描述成“数据隐藏。一般 而言,对象不应该将内

13、部数据成员暴露给外部世界。(也就是说,其可见性是protected或 private o) 封装但封装可不只是指数据隐藏。封装一般意味着各种隐藏。在本例中,讲师不知道哪些是普通学生,哪些是研究生。所以学生的类型对讲师隐藏了。 (也就是说,我封装了学生的类型)。在面向对象语言中,抽象类Student将隐藏从其派生的 类的类型。这是一个非常重要的概念。多态另一个要理解的术语是多态(polymorphism) o在面向对象语言中,我们经常用抽象类类型的引用来引用对象。但是,我们真正引用的 是从抽象类派生的类的具体实例。因此,当我们通过抽象引用概念性地要求对象做什么时,将得到不同的行为,具体行为 取决

14、于派生对象的具体类型。“多态”这个词来源于“poly”(意为“很多”)和“morph”(意为“形 态”)。因此,它的意思是彳艮多形态”。这个名称非常合适,因为同一个调用能够获得很多不 同形态的行为。在本例中,讲师告诉学生去下堂课的教室”。但是,根据学生类型的不同,他们会采取 不同的行为(因此出现了多态)。面向对象术语回顾术 语描 述类(class )与抽象类(abstract class)根据对象所具有的责任定义对象的类型。责任可以分为行为和/或状态。这些分别 是由方法和/或数据实现的;抽象类则定义了一组相关类的行为具体类(concrete class)实现抽象类某一特定类型行为的类。具体类是

15、一个概念特定、不变的实现封装(encapsulation)通常定义为数据隐藏,但最好将它看作任何形式的隐藏(类型、实现和设计等等)继承(inheritance)一个类继承另一个类,是指它接受了该类的一些或者所有性质。起始类称为基类、 超类、父类或者泛化类,而继承类称为派生类、子类或者特化类实例(instance)类的特例(总是一个对象)。类的特殊实例或者实体。每个对象都有自己的状态。 因此同一个类型(类)可以有几个对象*实例化(instantiation)创建类的一个实例的过程接口( inteface)接口与类类似,但是只为其成员提供规约而不提供实现。它与只含有抽象成员的 抽象类很相似。编程的时候,如果需要几个类共享公共基类中没有的一些特性,而 且希望确保每个类自己实现这些特性(因为所有成员都是抽象的),就应该使用接 口视角(perspective )观察对象有三种视角:概念视角、规约视角和实现视角。这三个不同层次的区别在 理解抽象类与其派生类之间的关系上用处很大。抽象类定义了如何在概念层次上解决 问题,还提供了与任何派生对象通信的规约。每个派生类都按需要提供特定的实现多态(polymorphism)能够用一种方式引用一个类的不同派生类,但获得的行为对应于所引用的派生类*有些面向对象分析人员说万事万物皆对象:类是对象,实例也是对象。这在技术上可能是

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号