2.4.4 继承(Inherit)

继承关系也称为泛化或特化关系,是模型元素之间的一种强耦合的关系。

对于两个类来说,如果一个类拥有另一个类的所有属性和方法,同时前者还可以拥有自己特殊的属性和方法,并且还可以修改或重新定义后者的方法,则称这两个类之间存在泛化关系。称前者为派生类或子类,后者为基类或父类。

继承的表示非常简单,UML使用一个带有三角形箭头的实线表示。如图2-15所示,箭头一端指向基类,另一端则指向派生类。

图2-15 表示继承关系的类图实例

图2-15表示了一个带有继承关系的类图,图中A是超类或父类,也称为基类,B是子类,也称为派生类。

如果把继承关系中的父类替换成一个接口时,子类则被称为接口的一个实现。此时,二者之间的关系则称为实现关系。实现的图形符号一般使用带有三角形箭头的虚线表示,如图2-11所示。

UML为接口提供了带有构造型的类图和带有直线的小圆圈两种图形表示,图2-4中给出了名为IUnkown的接口的两种图形表示,前者隐藏接口中定义的操作,后者则包含了接口中的操作列表,二者的语义是相同的,只不过在某种上下文中前者更加简洁。

如果考虑类与接口的实现,实现关系将是一种比继承关系耦合度更低的关系。但由于一个接口仅描述了一组抽象操作,或者说接口并不会被映射成目标系统中的实际模块,所以单纯讨论接口与实现之间的耦合问题将是毫无意义的。但从实现的角度来看,却可以派生出一种新的、类(或对象)之间的关系被称为接口依赖的关系。接口依赖关系显然是所有这些关系中耦合度最弱的一种关系。

例如,图2-16说明了接口依赖关系,其中Interface是一个接口,类A是接口Interface的一个实现,类B通过接口Interface访问了类A,此时称从B到A之间存在着一个接口依赖。显然从B到A的接口依赖要比从B到A的直接依赖的依赖程度要低一些,但这增加了接口设计方面的开销。

图2-16表示了一种接口依赖关系