泛化是通用的分类器(超类)和更具体的分类器(子类)之间的一种二元分类学(即与分类相关)的定向关系。
特定分类器的每个实例也是一般分类器的间接实例,所以我们可以说“患者是一个人”,“储蓄帐户是一个帐户”等。因此,泛化关系也被非正式地称为"
是一个"关系
支票帐户,储蓄帐户和贷记帐户按帐户进行概括
引用相同通用分类器的泛化关系也可以以“共享目标样式”连接在一起。
支票帐户,储蓄帐户和贷记帐户按帐户进行概括
继承
在OOAD中,继承通常被定义为一种机制,通过这种机制,更具体的类(称为子类或派生类)可以合并更通用的类(称为超类或基类)的结构和行为。
在UML 1.4.2中使用完整描述符和段描述符的概念 解释了继承。完整的描述符包含该对象包含的所有属性,关联,操作和约束的描述,并且通常是隐式的,因为它是由使用继承组合在一起的增量段构成的。
在面向对象的语言中,对象的描述是基于增量段构建的,这些增量段使用继承进行组合以生成对象的完整描述符。段是在模型中实际声明的建模元素。它们包括诸如class之类的元素和其他可概括的元素。每个可概括的元素都包含一系列功能和其他关系,并将其添加到其祖先继承的内容中。
每种通用元素都有一组可继承的功能。对于任何模型元素,这些都包括约束。对于分类器,这些分类器包括功能(属性,操作,信号接收和方法)和参与关联。[
UML 1.4.2规范 ]
如果一个可泛化的元素有多个父元素(多重继承),那么它的完整描述符包含来自它自己的段描述符的特性和它所有始祖的段描述符的联合。
无法重新定义 UML 1.4中的属性, 但是可以在多个子类中声明一个方法。在任何段中声明的方法将取代并替换在任何初始类中声明的具有相同签名的方法。
UML 2.4和最新的UML 2.5规范未提供继承的定义。UML
2.x的规范说,与泛化专业分类继承 功能 更普遍的分类。同样, 适用于通用分类器实例的任何约束也适用于特定分类器的实例。
uml 2.5提供了一些关于继承如何在uml中工作的模糊和不完整的解释
概括分类器时,其泛化的某些成员将被继承,即它们的行为就像在继承的分类器本身中被定义一样。例如,作为属性的继承成员在继承的分类器的任何实例中都具有值或值的集合,并且可以在继承的分类符的实例上调用作为操作的继承成员。[UML
2.5规范]
多重继承
ML标准隐式地允许多重继承,而该标准没有提供它是什么的定义。
UML中的分类器可以与普通的分类器有零个、一个或多个泛化关系。在OOAD中,多重继承是指一个类从多个超类继承行为和特性的能力。
顾问经理和永久经理的多重继承----都是从两个类别继承的
多重继承的起源可以在正交分类法中结合在一起。例如,上图结合了两种不同的员工分类,一种是基于员工是永久员工还是临时员工,另一种是基于员工的职位。
尽管uml标准隐式地允许多重继承,但它没有为众所周知的问题和含糊不清的地方(比如diamond问题)提供显式的解决方案或建议。
diamond问题示例-button继承了equals()的两个实现
在上面的多重继承菱形问题示例中,Button类继承了equals()的两个不同实现,而它没有自己的操作实现。当调用button.equals()时,不知道将使用哪个实现(从矩形还是从可单击)。
。
UML概要文件允许专门化泛化的语义。例如,在Java语言概要文件中,类的泛化应该被限制为单一继承。
泛化集
泛化集是一个可封装的元素 ,它允许我们通过将特定通用分类器的某些概括组合成(子)集来定义分类层次。每个泛化集合也可以与
称为其powertype的分类器相关联。
每个泛化集都有两个属性-iscovering(完全约束或不完全约束)和is
disjoint(不相交约束或重叠约束),以说明它是什么类型的集。
泛化集 的isCovering属性指定该泛化集中的特定分类器集是否完整。对于覆盖({complete})泛化集,一般分类器的每个实例也是(至少)一个特定分类器的实例。如果集合没有覆盖({incomplete}),则可能存在一些通用分类器的实例,这些实例无法归类为来自通用集合的任何特定分类器。
所述isDisjoint属性指定的泛化集的特定分类器是否可以重叠。约束为{disjoint}的泛化集没有任何特定分类器的实例,也可能是另一个特定分类器的实例(即,没有重叠的分类器)。如果泛化集为{overlapping},则其某些或所有特定分类器可以共享公共实例。
默认情况下,在UML 2.0到UML 2.4.1中, 泛化集为{incomplete,disjoint},而在UML
2.5中,默认集更改为{incomplete,重叠}。
泛化集可以有选择地与分类器(称为幂类型)相关联。在这种情况下,幂类型实例可以被视为在语义上等效于泛化集中每个泛化中的每个对应的专化分类器。UML规范没有规定如何实现这种语义对等以及如何维护其完整性。
在图上,泛化集约束放置在集合旁边,泛化集的公共箭头附近或泛化集的虚线附近。
功率类型规范显示为冒号,后跟对应的泛化集附近的功率类型分类器的名称。
医疗保险单泛化集与幂型实例-
保险种类齐全、重叠,保险计划不完整、不连续。
完整的例子可以在这里找到:健康保险策略泛化集和powertypes示例。
|