摘自《UML+OOPC嵌入式C语言开发精讲》
11.3 对象与函数
11.3.1 函数的角色
经济诺贝尔奖得主H.A.Simon(H.A.Simon,计算机人工智能之父)在其1962年的文章《The Architecture of Complexity》中说道:“从小系统建造成庞大系统时,若有稳定的中间模块(Intermediate Module),则庞大的系统稳定且发展快速。”在日常生活中,高楼大厦之所以能够迅速建造起来,是因为使用了大量预制的中层模块(如帷窗等)。这些中层模块较平房常用的砖块大一些。
在计算机软件上,也适用同样的观念。程序的最小模块是一个指令,如果一个程序含有10 000行指令,但未加分组或分类,这样的程序将很复杂,难以驾驭。基于Simon的观念,人们将程序分而治之(Devide and Conque),分为几个中间模块(Module),就是通称的函数(Function)、程序(Procedure)、子程序(Subroutine)或段(Paragraph)。如图11-2所示。
此时,软件中的函数或子程序扮演着模块的角色,使得人们能快速建造出庞大的软件系统。函数如同砖块,是建造一般房子的中层模块。至于建造高楼大厦,则适宜采用更大的中层模块。因此计算机软件人员,必须将函数分门别类,并组成中上层的模块——对象(Object)。
图11-2
传统程序直接由函数或子程序所组成,OOP软件则将函数纳入对象中,再由对象组成庞大程序。函数隶属于对象,与对象中的数据密切联系在一起。软件的建造理念和高楼大厦的建造观念是一致的。函数的角色为:
l 从对象本身观之,函数表达了对象的动态行为。
l 从整个系统观之,函数是支持中层模块(即对象)的支架。
在“泪眼问花花不语,乱红飞过秋千去”的例子中,女主角的行为有“流泪”(Cry)及“问”(Ask),花的行为有“语”(Say)和“飞”(Fly),秋千的行为有“摆荡”(Swing)。以对象来组织这些函数,如图11-3所示。
图11-3
Cry() 和Ask() 是“女主角”对象内的函数,Say() 和Fly() 是“花”对象内的函数,而Swing() 为“秋千”对象内的函数。
11.3.2 对象与类
类是群体(或集合),而对象是类中的一份子。人们常用“是一个”(is a)来表达对象与类之间的关系。例如:
l 月亮是一个星球。
l 嫦娥是一位(个)美丽的神仙。
l 毕加索是一个艺术家。
l 毕加索是一个画家。
l 张大千是一个画家。
l 贝多芬是一个音乐家。
.....
所以“月球”是对象,属于“星球”类的一份子。毕加索是对象,艺术家是类,同样地,画家也是类,其中画家是艺术家群体中的小群体(部分集合)。毕加索和张大千同属于“画家”类,所以具有共同特点——精于美术绘画。
11.3.3 类的用途:描述对象的共同特点
软件中的对象为自然界对象的抽象表示,只表达了其重要特征与行为,而忽略了细节部分。至于哪些是重要特征和行为呢?程序中必须加以说明。同类的对象具有共同的重要特征与行为,因此可由类统一说明对象应表达的那些特征和行为。也就是说,类统一说明了对象应含哪些“数据”(Data)和哪些“函数”(Function)。例如:
double a = 3.5 + 5;
printf(a);
C语言已定义的double、int等数据类型,其变量含有+、-、*、/等基本运算(行为),凡double的变量皆能做这些运算。同理,如果我们创造了新的数据类型(即类)——花,且定义如下:
CLASS(花)
{
char name[10];
int color;
void fly();
void say();
};
这就是花类的定义,它说明了,
花类内的对象(即“花”数据类型的变量)皆具两项共同特征:name和color。
l 花类的对象皆具两项共同行为:fly()和say()。
同类的对象特征和行为是一致的,所以只须在类定义中统一说明,不必对对象逐一说明。定义好以后,就能借花类来声明对象了,此时也可以将类视为数据类型,则花类的对象就是花数据类型的变量了。花类如图11-4所示。
图11-4
更多样章试读请访问:http://www.china-pub.com/209254