主旨概括:
主要介绍如何处理类与类之间的耦合关系
1.继承关系
继承关系表示的是一种“is a”的关系。即类B除了拥有A拥有的所有属性外,还有自己特有的属性。如研究生也是学生,男人、女人都是人,即可定义一个“学生类”“人类”,然后派生出“研究生类”"男人类"、“女人类”。
2.复合关系
符合关系表示一种“has a”的关系。类B是A的组成部分或者为A所拥有。
如:轮胎是汽车的一部分,每个圆圆包含一个“点”对象即圆心。这个时候可以采用封闭类的方式,令B是A的成员。
但并非所有符合关系都适合采用封闭类的方法,比如一个人拥有十只狗。对于人来说,重要的属性为“拥有狗的数量”,“哪些狗”;对于狗而言,重要的属性为“主人”等。
我们若采用封闭类的方式:
class CDog;
class Master
{
CDog dogs[10];
int dognum; //狗的数量
};
class CDog
{
Master m;
}
这种方式不为编译器所接受,因为虽然我们对CDog提前进行了说明,但是由于CDog中也有Master的成员,所以导致了循环定义。
可以将对象数组改为指针数组来避免循环定义的错误:
class CDog;
class Master
{
CDog* dogs[10];
int dognum; //狗的数量
};
class CDog
{
Master m;
}
不同的是,在生成一个Master实例时,无需知道CDog是什么样子的,只需要申请一片存储指针的空间,即可生成一个Master实例;当Master养了一条狗时,只需用new运算符申请一片空间存放CDog对象,再将相应指针指向这篇空间即可。
但这种表示会导致每生成一个CDog实例便会生成一个Master实例,这明显是多余的,而且当主人的信息发生变化后,还需要找出每条狗的m进行修改,即为麻烦。
可进行改进:
class CDog;
class Master
{
CDog dogs[10];
int dognum; //狗的数量
};
class CDog
{
Master* m;
}
即在主人类中设置一个狗的对象数组,而狗的类中设置一个指向主人对象的指针。又或者可以将主人类中的对象数组也改为一个指向狗的类的指针数组,以节约空间。
这中类A中可能含有多个类B的对象关系,如一个主人有多条狗,一款车下有多种型号,一个老师管理多个学生,都可以在A中设置B的对象或指针数组,而在B中设置指向A对象的指针。