7.5.4 导航到关联类
为了指定到关联类(示例中的Job和Marriage)的导航,OCL使用点号和关联类的名称:
context Person inv:
self.Job
子表达式self.Job计算为一个集合,包含了一个人在其所有雇主公司的工作。对于一个关联类,类图中国没有显式的角色名。此处导航中使用的名称Job是关联类的名称。
对于一个到类自身的关联,光有关联类的名称还不够。我们还需要区分关联的方向。以如下的模型为例:
图7.3 Navigating recursive association classes
当导航到像EmployeeRanking这样的关联类是,根据不同的方向有两种可能。例如,在上面的示例中,我们可以导航到employees端,或者是boxes端。只是单独地使用关联类的名称,这两种情况是无法区分的。为了能够区分,需要把目标方向的角色名称加到关联名称,放在方括号内。如下:
context Person inv:
self.EmployeeRanking[bosses]->sum() > 0
self.EmployeeRanking[bosses]计算为属于bosses集合的EmployeeRanking集合。在如下的表达式:
context Person inv:
self.EmployeeRanking[Employees]->sum() > 0
self.EmployeeRanking[bosses]计算为属于employees集合的EmployeeRanking集合。在这样的自身关联的清晰下,是不允许使用没有限定的关联类名称的。因此,如下的示例是无效的:
context Person inv:
self.EmployeeRanking->sum() > 0 -- 无效!
在一个不是到自身的关联情况下,只有关联名就够了,尽管也允许使用限定的版本。因此,本节开始的示例也可以写为:
context Person inv:
self.Job[employer]