认识对象
自然界的对象( Natural Object)
对个人而言,所认识的东西,皆是“对象”(object)。
一旦认识某样东西,就能说出其特点,并与别的对象进行比较。
其特点包括:
对象的特征或属性( Attribute)
对象的行为( Behavior)
了解东西的特征和行为,就表示对该事物有些认识和概念( Concepts)了。尽管有些东西并不存在,但只要对其有概念,就是对象了。例如,龙、凤凰、月中白兔、嫦娥等皆是我们熟悉的对象。但对于未听过嫦娥奔月故事的外国人来说,嫦娥并非对象。
软件对象(Software Object)
牛津字典对“抽象”( Abstraction)的定义是,“人们脑海中对重点与细节的区分行动”(The Act of Separating in Thought)。抽象的主要目的有:
-
掌握重点( Essential),避免被复杂的细节( Detail)所迷惑。例如,准备联考令考生千头万绪,“重点复习”令其事半功倍。
-
舍异求同,找出对象间的共同性。例如,动物和植物有所区别也有相同处,若不计较其相异处,可发现它们的共同点一活生生的,因此属于相同种类一一生物
软件对象 = 数据 + 函数
数据表达自然界对象的特征,函数表达自然界对象的行为。
对象与函数
传统程序直接由函数或子程序所组成,OOP软件则将函数纳入对象中,再由对象组成庞大程序。函数隶属于对象,与对象中的数据密切联系在一起。软件的建造理念和高楼大厦的建造观念是一致的。函数的角色为:
- 从对象本身观之,函数表达了对象的动态行为。
- 从整个系统观之,函数是支持中层模块(即对象)的支架。
在“泪眼问花花不语,乱红飞过秋千去”的例子中,女主角的行为有“流泪”(Cry)及问”(Ask),花的行为有“语”(Say)和“飞”(Fly),秋千的行为有“摆荡”( Swing)。
以对象来组织这些函数。
对象与类
类是群体(或集合),而对象是类中的一份子。人们常用“是一个”(is a)来表达对象与
类之间的关系。例如:
- 月亮是一个星球。
- 嫦娥是一位(个)美丽的神。
- 毕加素是一个艺术家
- 张大千是一个画家。
- 贝多芬是一个音乐家。
所以“月球”是对象,属于“星球”类的一份子。毕加索是对象,艺术家是类,同样地,画家也是类,其中画家是艺术家群体中的小群体(部分集合)。毕加索和张大千同属于“画
家”类,所以具有共同特点一一精于美术绘画
类的用途:描述对象的共同特点
C语言已定义的 double、int等数据类型,其变量含有+、-、*、/等基本运算(行为),凡 double的变量皆能做这些运算。同理,如果我们创造了新的数据类型(即类)一花,
且定义如下:
CLASS(花)
{
char name[10];
int clolr;
void fly();
void say();
};
这就是花类的定义,说明了
花类内的对象(即“花”数据类型的变量)皆具两项共同特征:name和 color
类的目的是创造新数据类型。为了描述自然界的万事万物,必须有各式各样的数据类型,才能充分贴切地表达自然界的静态与动态之美。C语言只提供有限几种基本数据类型,欲表达人类社会或大自然的景象,实在不够。
然而C语言加上“类”( Class)概念之后,就很容易解决这个问题了。它让程序员定义与创造自己心爱的数据类型来描述心中所想的、眼睛所看到的任何自然界景象
在C语言里,int、 double及char等常被称为“基本数据类型"( Fundamental Data Type)借类而创造出来的数据类型则被称为“抽象数据类型”( Abstract Data_Type)。“抽象”意味着类只描述自然事物的重要( Essential)特征和行为,而忽略不重要的细节。于是,有个不成
文的规则是:
-
由基本数据类型所声明的变量,称为变量
-
由抽象数据类型(类)所声明的变量,称为对象。
此规则的目的是让已受古典程序熏陶的C程序员,能区别C与OOPC的不同。如果您对软件的认识才刚起步,宜把变量和对象视为同义词,这是OOP的本质,只因C++从C演变而来,担负了新旧传承的任务,才加以区分的。
类是一群具有共同重要特性的对象。类的定义就是说明这群对象具有什么样的重要特性。特性包括对象的特征及行为。
软件中的对象用数据来表达特征,用函数来表达行为。
因此,类的定义就是说明软件中的对象,应含哪些数据及哪些函数。定义类时,应考虑:
- 想描述哪些对象
- 对象有哪些特征
构造器(Constructor)
在OOPC程序中,设计类是一件重要工作,其目的是借之产生对象。其中有个幕后工作者,它依照类的定义产生对象,可称之为“对象之母”。这个幕后工作者就是“构造器”
( Constructor)函数。它的主要功能为,依照类的定义分配内存空间给所声明的对象。在lw_ oopc.h头文件里已经定义了构造器宏,可以直接使用。