抽象模型中的“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播放机烤面包圈——至少成功机会微乎其微)。所以,成功设计一个类的重要因素,就是确保它赖以完成任务的行为能被执行。在本书的第二部分,我们将看到如何在系统需求的基础上确定对象的任务、数据结构和行为。
术语“feature(特征)”和“member(成员)”可以互换,被用来描述类的attribute和方法。即,一个类定义如果包括三个attribute声明和五个方法声明,则可以说它有八个特征/成员。“特征”是普通OO意义上的术语,而“成员”则是C#的特定术语。在本书的第一和第二部分,我们将使用普通OO意义,在第三部分切换为C#的特定意义。
特征是类的构建块:实际上一个类定义中能找到的东西,要么是该类的attribute,要么就是该类的方法。
在C#语言中,有些其他类型也是类定义的特征,不过在读到本书第三部分之前无需多虑。概念上,现在认为类只包括attribute和方法,已经足够。
3.4.1 关于命名惯例的说明
命名一个类时,建议用大写字母开头,整个名称使用混合大小写的方式:Student, Course, Professor,等等。当类名可以用词组来体现其含义时,如“course catalog”,每个单词第一个字母用大写,所有单词直接连接,不使用空格、连接线或下画线分隔:例如,CourseCatalog。这种方式被称之为Pascal命名法(Pascal casing)。
对于方法名,C#的惯例也是使用Pascal 命名法。典型的方法名形如Main, GetName或RegisterForCourse。
反之,attribute的C#命名惯例却是以小写字母开头,后面跟随的每个单词都以大写字母开头。典型的attribute名形如name, studentId或courseLoad。这种风格被称之为Camel命名法(Camel casimg)。
后面的章节中,我们将探讨如何使用Pascal命名法和Camel命名法。
3.4.2 实体化(Instantiation)
类定义可以看作是创建软件对象的模板——一种“模型”,用来
l 在内存中开辟一个数据区,储存新对象的attribute
l 把一系列行为和对象关联起来
术语“实体化(instantiation)”指对象在类声明基础上被创建(构造)的过程。从单个类声明——例如,Student类——可以创建许多对象,如同使用同一把曲奇饼模刀能切出许多曲奇饼。对象,也可以说成是特定类的实体(instance)——如Student对象是Student类的一个实体。在本章的后面部分,我们将讨论C#中对象在被实体化时的物理过程。
类与对象的不同之处在于:
l 类定义特征——attribute、方法等——该类的所有对象都拥有这些特性,可以把类看作是对象模板(template),如图3-1所示。
l 对象是模板的单一实体,attribute值已经给出,方法可以被调用,如图3-2所示。

图3-1 类定义了attribute名称和类型

图3-2 对象给出attribute值
3.4.2.1 封装(Encapsulation)
封装(Encapsulation)是一个正式术语,表示将对象状态和行为绑到单一逻辑单元中的机制。理论上,对于某个特定学生,我们需要了解的情况,要么直接表现为对象的字段(field),要么间接表现为给出问题的答案或影响对象状态的方法(method)。
封装不是OO语言所独有的,但从某种意义上说,被OO语言完善了。如果你熟悉C语言,会知道一个C struct这样封装数据:
struct employee {
char name[30];
int age;
}
下例中,C语言函数封装了操作逻辑——数据被传入、计算,给出(可选的)返回值:
float average(float x, float y){
return (x + y)/2.0;
}
但是,把数据和行为封装到单一构造,用来表示真实世界实体的抽象模型,这样的概念只有在OO编程语言中得到真正采用。





