3 第 章 
Objects and Classes
对象(Object)和类(Class)
对象是面向对象(Object-Oriented,OO)系统的基本构成块。你在第2章中曾经学到,抽象
被用来创建真实世界的一个模型。在本章中,你将了解对象是构成这个模型的真实世界中不同
组成部分的“小规模抽象”。
在本章中,你将学到:
l软件对象由什么构成
l如何使用类来开列对象的数据和行为
l如何在类声明的基础上创建对象
l对象间如何相互跟踪
3.1  什么是对象
在谈及软件意义上的对象前,我们先来说说真实世界中的对象。根据《韦氏大词典》(Merriam-Webster’s Collegiate Dictionary)的词典释义,对象是
(1) 某种可为人所感知的物质;
(2) 思维、感受或动作所作用的物质或精神体。
Beginning C# Objects中文版——概念到代码
第3章  对象(Object)和类(Class) 
Beginning C# Objects 中文版——概念到代码
・52・ 该释义的第一部分所指就是我们熟知的“对象”:可以看到和触摸的“东西”,而且它占据空间。既然本书将把学生选课系统(Student Registration System, SRS)作为学习对象编程的入门案例,我们不妨想想一般大学中存在的物理对象的例子。
l  听讲的学生variable什么意思中文
l  讲课的教授
l  用来上课的教室
l  教室中的家具
l  教室所在的建筑物
l  学生使用的课本
诸如此类。当然,尽管所有这些对象都能在典型的大学校园中到,但并非其中每一种都与学生选课相关,或者是SRS 案例所必须的,不过现在无需担心这些事情。在本书的第二部分,你将学习使用需求规格说明书来甄别与特定抽象模型相关的对象类型。
现在,将注意力集中到释义中的第二部分,特别是“思维、感受或动作所作用的……精神体”这个短语。在一所大学中有许多重要的概念性对象;包括
l  学生选修的课程
l  教师服务的院系
l  学生得到的评分
当然,还有许多其他东西。即便我们不能看到、听到、触摸到、品尝到或是嗅闻到概念性对象,它们仍然是在描述抽象模型时和物理对象同等重要的因素。
现在稍微正式点,来为软件对象下个定义:
l  所谓(软件)对象,是一种将状态(数据)和行为(操作)合成到一起的软件构造,
用来描述真实世界的一个(物理或概念性的)对象。
下面稍稍深入地分别探讨对象的两个方面——状态与行为。
3.2  状态(State)/Attribute(特征属性)/数据(Data)
记录一个学生的信息,需要哪些数据?其中一些如下例:
l  学生姓名
l  学号(ID 号)
l  生日
l  住址
l  主要研究方向(如果已经提出的话)
l  累计平均等级分(GPA )
69 70
3.3  行为(Behavior)/操作(Operations)/方法(Methods) 
Beginning C# Objects 中文版——概念到代码
・53・ 
l  导师(faculty advisor)是谁
l  本学期要修的课程(course load) l  截至目前该生已经修过的课程,修每门课程时的学期/学年,得到的分数;即学生的成
绩单
等等。那么,对于课程情形又是如何呢?也许应该记录
l  课程编号(如“ART 101”)
l  课程名称(如“织篮入门”)
l  在被允许选修本课程之前学生必须先通过的课程(即先修课程)
l  课程有效学时
l  有资格承担本课程教学任务的教授列表
如此等等。用面向对象术语来说,用于描述一个对象的数据元素,被称之为对象的attribute 。 这里所说的“attribute ”是一种对象建模和编程的语言中立约定。但是,所有的.NET 语言(包括C#)都拥有一种特殊的编程构造,被称之为“attribute ”,它存在的目的远比“指示对象的数据元素”来得复杂。在谈及某种特定的.NET 语言时,不要将两种不同意义的“attribute ”混淆起来。(在.NET 语言中,使用普通意义上的术语“field ”表示对象的元素/attribute 。)
我们将在第13章解释C#(.NET)中“attribute ”的含义。而现在(包括本书第一部分和第二部分),只要提到“attribute ”,仅指其在普遍OO 意义上的含义。 当被集中起来时,对象的attribute 值用来定义对象的状态(state),或状况。例如,要判断某个学生是否“具备毕业资格”(状态),可以把以下元素合成起来作参考
l  成绩单(第一个attribute ),以及
l  该生目前选修的课程(第二个attribute )
用来判断该生在本学期结束时是否满足主修专业(第三个attribute )的学分要求。
一个给定的attribute 可以很简单,如“GPA ”可以仅表现为浮点数,也可以很复杂,如“成绩单”,就表现为更具扩展性的信息集合,无法以简单形式表达(至少无法用C#简单类型表达)。
3.3  行为(Behavior)/操作(Operations )/方法
(Methods)
现在,我们回头看两种对象——学生和课程——探讨它们各自的行为。学生的行为(当然是与大学学习相关的)可能包括
71
第3章  对象(Object)和类(Class) 
Beginning C# Objects 中文版——概念到代码
・54・ 
l  选修一门课程
l  退选一门课程 l  选择主修方向(major field of study)
l  选择导师(advisor)
l  告诉你他(或她)的GPA
l  告诉你他(或她)是否已选修某门课程,如果选修了该门课程,是在什么时候修的,
哪位教授上课,以及得到的分数。
有些难以想象,类似课程这样的无生命的概念性对象会做出什么行为,但如果把课程当作一种生命体,可以想见一门课程的行为会是
l  允许学生选修
l  判断指定的学生是否已经选修
l  告诉你已经有多少学生选修,反过来说,还有多少名额空缺
l  告诉你需要什么先修课程
l  告诉你课程有效学时是多少
l  告诉你本学期哪位教授将上这门课
等等。
当特指软件对象时,我们把对象的行为或称操作(operations ),定义为用以访问对象的attribute (数据)和修改/维护attribute 值(数据)的方法。
花点时间回顾上文所列的学生行为,可以看到每种操作都与学生的一个或多个attribrte 有关。例如:
l  “告诉你他(或她)的GPA ”与“访问学生的GPA attribute ”相关
l  “选择主修方向”与“修改学生的主修attribute ”相关
l  “选修一门课程”与“修改学生的当前课程列表”相关
我们已经知道,对象的attribute 值集合定义了对象的状态,现在可以看到,操作能够修改对象状态。例如,定义一位尚未选定主修方向的学生为“未选定方向”的学生。调用这样一个学生对象的“选择主修方向”
方法,将导致对象更新其“主修”attribute ,反映出刚选定的主
修方向。然后,学生的状态就从“未选定方向”变更到“已选定方向”。
从另一种角度来考虑,对象操作也可以看作是可以向对象要求提供的服务。例如,课程对象提供一种服务,该服务提供当前选修该课程的学生列表(花名册)。
在用C#这样的语言编写对象时,使用更严格的编程语言术语“method (方法)”来表示“操作”,而术语“操作”则被用于表示概念意义上的行为。
72 73
3.4  类(Class) Beginning C# Objects 中文版——概念到代码 ・55・ 
3.4  类(Class )
抽象模型中的“class (类)”描述了一组相似对象的共同特性。例如,名为“Student ”的类可能被用来描述学生选课系统中的所有学生对象。
类定义以下要素:
l  定义该类的对象所需要的数据结构(attribute 的名称和类型)
l  这些对象要执行的操作,尤其是有哪些操作,类的对象如何被调用执行这些操作,以
及对象执行这些操作时的“后台动作”
例如,Student 类可能包括表3-1所示的九种attribute 。
表3-1  创建学生类的建议attribute
attribute
类型 name
string studentid
string birthdate
DateTime address
string major
sting gpa
double advisor
??? courseLoad
??? transcript ??? 也就是说,每个Student 对象都将拥有同样的九种attribute 。注意,其中许多attribute 可以用C#预定义类型体现(如String , double ,和 DateTime ),但小部分attribute ——advisor, courseLoad 和transcript ——则过于复杂,预定义类型就不够用了;稍后你将学习如何处理这样的attribute 。
从操作的角度来看,Student 类可能会定义下列五种方法:
l  RegisterForCourse
l  DropCourse
l  ChooseMajor
l  ChangeAdvisor
l  PrintTranscript
注意,对象只能做所属类已定义的方法所规定的操作。从这个角度来看,对象就像用具,只能执行设计好的操作(如DVD 播放机提供播放、暂停、停止和搜索特定场景的按钮),除此之外别无所能(不能要求DVD 播放机烤面包圈——至少成功机会微乎其微)。所以,成功设计一个类的重要因素,就是确保它赖以完成任务的行为能被执行。在本书的第二部分,我们将看到如何在系统需求的基础上确定对象的任务、数据结构和行为。 74
75

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。