类图:类图是最常用的表现系统静态结构的图示,类图可以显示系统中存在的所有类,以及类的属性,方法,类间关系等,如图11-2 反映了设计模型中的类间关系
对象图表示的是系统某一时刻所包含的所有对象的状态以及对象之间的相互关系,时间上是类图在运行时的一个快照,而任何系统在运行时都是不断变化的,不同时刻系统中的对象图可能有很大的不同,因此对于一副对象图,我们必须指明该图是什么时刻的系统快照,否则没有意义。如图11-1 显示fishGUI系统运行时,主要对象实例间的关系
继承树的透明和安全:
透明:让客户程序透明地,无障碍地访问不同层次的类,这时面向对象语言提供继承机制的主要意图,也是完全替换原则的要求。在这种方案中最高层的抽象类如图11-3中的“动物”定义了适用于所有动物的接口,其他的派生类实现相应的接口即可。
透明和职责分配的冲突;透明的继承用起来方便,但是存在一些问题:首先,当继承上的动物种类非常多时,很多动物都会有自己特有的一些行为,如果我们把这些行为全部定义在最高层的抽象类中,那么“动物“这个抽象类就会异常庞大,不易扩展和维护;其次,”飞“这个职责是否应该放在最高层的抽象类中----可以飞放在抽象类鸟中;这样每个具体的动物类都只实现和自己相关的行为,职责非常清晰,但是给客户程序带了麻烦
安全的类型转换:
关于继承的层次:一种是完全透明的继承树,所有接口都在最高层抽象类中定义;另外一种是根据职责分配的原则,将接口分散在不同层次的抽象类中。在实际使用时,一般只有在继承树非常小时才能使用,当继承树非常庞大的时候,往往采用第二种方案。此时就可能需要安全的类型转换
在C++语言中,为了保证类型转换的安全,可以采用自定义类型标示和运行时类型信息(RTTI)
自定义类型标示:定义一个获取对象类型的接口,以使得继承树上每个类都能返回一个表述该类类型的识别信息,具体的实现方式是,为整颗继承树增加一个名为GetType的虚函数,该函数返回每个类的型别信息
运行时类型信息(RTTI):
运行时类型信息(Run-Time Type Infomation,RTTI)是C++语言标准中的特性,使应用程序能在运行中动态地确定对象的类型
使用dynamic表达式可以安全地把指针从继承树上的一个类型转换成另一个类型,如果转换时的目标类型与对象类型不兼容,dynamic_cast表达式就会自动返回一个NULL指针
使用typeid表达式,可以直接判断一个对象的类型是否符合我们的需要