5.3.3 泛化(继承)
泛化是一般事物(称为父类)和该事物的较为特殊的种类(称为子类)之间的关系。有时也称泛化为“is a kind of”关系:一个事物是更一般的事物的“一个种类”。父类又称为基类或超类,子类又称为派生类。例如A是B和C的父类,B、C具有公共类(父类)A,说明A是B、C的一般化(概括,也称泛化)。
泛化关系有利于类元的描述,可以增量式地向类元添加声明,每个添加的声明都扩充了从其父类继承来的描述。继承机制利用泛化构造了完整的类元描述,泛化和继承允许不同的类元共享属性、操作以及它们共有的关系,而不用重复说明。泛化意味着子类的对象可以被用在父类的对象可能出现的任何地方,反之则不然。换句话说,泛化意味着子类可以替换父类的声明。通常子类除了具有父类的属性和操作外,还可具有更多的属性和操作。与用例图相同,类图中也把泛化关系表示成一条带有空心箭头的实线,箭头从子类指向父类,如图5-12所示。
![]()
图5-12 泛化关系的表示方法
案例学习
◎图5-13的泛化关系示例中,“卡车”类和“轿车”类的父类是“汽车”类,“汽车”类和“火车”类的父类是“车辆”类,“轮船”类、“车辆”类、“飞机”类的父类是“运输工具”类,由此可以看出泛化关系的传递性。
(https://www.daowen.com)
图5-13 泛化关系示例
一个类可以有0个、1个或多个父类。没有父类并且最少有一个子类的类称为根类或基类;没有子类的类称为叶子类。如果一个类只有一个父类,则说它使用了单继承关系;如果一个类有多个父类,则说它使用了多继承关系(注意,在有些程序设计语言中不允许多继承关系的存在)。
在大多数情况下,用类或接口之间的泛化来表明继承关系。在UML中,可以在其他类目之间创建泛化,比如结点之间。
在UML中,对泛化关系有三个要求:
(1)子类与父类应该完全一致,对于父类所具有的属性、操作,子类应该都有。
(2)子类中除了与父类一致的信息以外,还包括额外的信息。
(3)可以使用父类的实例的地方,也可以使用子类的实例。