泛化是一种存在于一般元素和特殊元素之间的分类关系。
泛化关系(继承关系)中特殊元素和一般元素之间的关系:“is-a”关系
3.5.1 基本泛化关系
特殊类(子类)继承了一般类(超类)中所有的内容。
⒈ 单一继承
单一继承的每个子类只有一个超类。
图3.52 泛化关系的一个例子
图3.53 图3.52的另一种显示方式
图3.54 一个类层次图
图3.55 泛化关系的一个例子
⒉ 多重继承
图3.56 一个多重继承层次
⒊ 抽象类
抽象类是指那些不具有任何对象的类。
抽象类的作用只是让其他类来继承于它,为其他类描述它们的公共属性和行为。
抽象类的显示方法:将标记值{abstract}加到类图中表示抽象类的类名称部分,位于类名称的下方。
抽象操作的显示方法:在操作签名后加上特性字符串:{abstract},或将操作签名用斜体字显示。
图3.57 一个抽象类
子类可以重定义超类的操作。重定义的操作必须与超类中的操作具有相同的操作签名(返回类型、名称和参数)。
⒋ 多态性
多态性(Polymorphism)是一种方法,这种方法使得在多个类中可以定义同一个操作或属性名,并在每个类中可以有不同的实现。
图3.58 多态性的一个例子
图3.59 一个抽象类
图3.60 继承、多态以及聚合结合使用
图3.61 一个类层次图
Java实现
abstract public class Figure
{
abstract public void draw();
protected Pos position();
}
public class Group extends Figure
{
public void draw()
{
for ( int i = 0;i < consist_of.size(); i++ )
{
consist_of [i].draw();
}
}
//FigureVector is a specialized class of the standard
//Vector class which implement a dynamic array.
//FigureVector adds hard type checking
private FigureVector figures;
}
public class Polygon extends Figure
{
public void draw()
{
/* draw polygon code */
}
}
3.5.2 受约束的泛化关系
UML为泛化关系预定义的几种约束:
· 重叠(Overlapping)
· 互斥(Disjoint)
· 完全(Complete)
· 不完全(Incomplete)
(a)
(b)
图3.62 应用于继承的约束的不同方式
⒈ 互斥泛化关系和重叠泛化关系
重叠继承:在继承关系中,那些继承于某个子类的任何更深层次的子类可以继承于该继承关系的多个子类。
图3.63 指定了重叠约束的继承关系
互斥泛化关系:不允许将多个子类特化为一个公共子类。
⒉ 完全泛化关系和不完全泛化关系
· 如果某个约束指出一个泛化关系是完全的,就意味着已经指定了该泛化关系中的所有子类,并且不允许再增加子类了。
· 如果对一个泛化关系指定不完全约束,这就意味着还没有给出该泛化关系中的所有子类,允许以后再增加子类。
图3.64 指定了完全约束的泛化关系
图3.65 互斥的、不完全的继承
图3.66 一个重叠的、完全的继承层次
3.5.3 高级泛化关系
利用泛化组和权类型提供的机制,可以定义各种泛化关系。
⒈ 泛化组
子类可以以多种不同的方式类似父类。
图3.67 泛化组
⒉ 权类型
依据权类型,类可以继承不同的属性和操作。
图3.68 权类型的显示
3.6 依赖和精化(实现)关系
依赖关系是两个模型元素(被依赖模型元素和依赖模型元素)之间的一种语义连接。对被依赖模型元素进行的修改将影响依赖模型元素。
图3.69 类之间的一个依赖关系
图3.70 依赖关系的一个例子
精化(实现)关系是指同一个事物的两种描述之间的一种关系,这两种描述是在不同抽象层次上进行的。
图3.71 精化(实现)关系
3.7 约束和导出(规则)
约束是对一个模型施加某种限制;而导出是关于事物能够如何被导出的规则。
图3.72 图中VIP Customers是一种导出关联
图3.73 约束关联。Party leader of 关联是Member of关联的子集
图3.74 作用在属性Status上的约束
{profit = sales price – cost price}
图3.75 导出属性profit
3.8 接口和端口
封装(encapsulation):当一个对象执行自己的操作时,它对外界隐藏了操作的细节。
接口(interface)是描述类的部分行为的一组操作,它也是一个类提供给另一个类的一组操作。
图3.76 实现了接口的类和使用接口的类
图3.77 实现了接口的类
图3.78 接口和类的交互
端口
端口展示了类和环境交互的点。
图3.79 端口
图3.80 实现了接口Storable 的类:Person
Java实现
interface Storable
{
public void Save ();
public void Load ();
}
public class Person implements Storable
{
public void Save ()
{
//Implementation of Save operation for Person
}
public void Load ()
{
//Implementation of Load operation for Person
}
}
3.9 包
⒈ 包的定义
在UML中,包的定义是用于将多个元素组织为语义相关的组的一个通用机制。
一个包拥有或引用的所有模型元素称为该包的内容。
包实例没有任何语义(意义)。
Subsystem
包之间的关系:泛化、依赖和精化。
图3.81 包之间的泛化和依赖关系
图3.82 包的精化
图3.83 子系统E依赖于子系统B。子系统C依赖于子系统B和D。子系统B、C和E在子系统A的内部。
图3.84 子系统D和E是从泛化子系统C特化的。子系统B、C、D和E在子系统A的内部。子系统C依赖于B。
图3.85 包Z在包W的内部,包W被引入到包A内。包B依赖于被引入的包Z。
图3.86 包X包含类P和S。包A有一个接口I。类S在包X的内部,并依赖于包A的接口I。
包的合并
图3.87 包的合并
⒉ 包的特性:
① 一个包可以引入其他包内的模型元素。
② 包实例没有任何语义(意义)。
③ 包之间允许的关系有依赖关系、精化关系和泛化关系。
④ 包有四种可见性:
· 公有(Public)可见性:其他元素可以查看并使用本包内的内容。
· 私有(Private)可见性:只有拥有该模型元素的包,或引入该模型元素的包才可以使用该元素。
· 保护(Protected)可见性:只有拥有或引入该模型元素的包可以使用该元素,同时,特殊包(即继承关系中的子包)也可以访问一般包(即继承关系中的父包)中的内容。
· 实现(Implementation)可见性:如果一个包具有实现可见性,那么其他包就不能从此包中引入元素。
⑤ 一个包可以有一个用于发布此包行为的接口。
3.10 模板
Template
一个模板就是一个还没有完全指定的类,但是该类的最终规格说明已经由那些传递给模板的参数决定了。
参数化的类用于指定一组类。参数化的类有一个包含了每一个参数的名称和类型的参数列表。
参数列表:[T:class, A:integer] 或 [T, A:integer]
图3.88 参数化类Array
图3.89 参数化类LivingThing
图3.90 参数化类LivingThing的显式绑定
图3.91 参数化类LivingThing的隐式绑定
3.11 复合结构图
图3.92 复合结构图示例
图3.93 一个复合结构图