当一个类与两个类关联时,多对一的多样性

时间:2015-10-01 22:31:41

标签: uml class-diagram

背景:我有一个抽象类 学生 。在本课程中,我推导出三个具体的课程 SchoolStudent,UnderGradStudent PostGradStudent 。我有另一个班车辆。学校学生必须驾驶车辆,然而,本科生或研究生可能会或可能不会驾驶车辆。但是每辆车都必须由某人驾驶,因此车辆课程可以引用学生。

问题:我之间有关联类 UnderGradStudent&车辆 PostGradStudent&车辆即可。但是,我对多重性感到有些困惑。

据我所知,UML类图应如下所示:enter image description here

但是,我怀疑上图显示每个广告将有一个 UnderGradStudent 以及一个 PostGradStudent

上图是否正确我想要对应于上下文的模型?

2 个答案:

答案 0 :(得分:2)

当你绘制这个UML图时,它暗示(但没有正确说明)Vehicle必须由一个UnderGradStudent和一个{{PostGradStudent驱动1}}。它还意味着UnderGradStudent可以驱动任意数量的Vehicle,而PostGradStudent可以驱动任意数量的Vehicle(同时)。我不认为那是你的意图。我说“暗示”的原因是你在一端覆盖了两个关联。最后我查了一下,这是无效的UML。

我想您想说Vehicle可能最多由一个Undergrad StudentPostgrad Student驱动。要说,我推荐以下型号:

Corrected Diagram

这说的是:

  • Student的有效实例必须是School StudentUndergrad StudentPostgrad Student之一(而不是多重分类)
  • Allowed Driver的有效实例必须是Undergrad StudentPostgrad Student之一(而不是多重分类)
  • Vehicle最多可由Allowed Driver(一次)驱动
  • Allowed Driver最多可驱动一个Vehicle(一次)

这描述了任何时间点的有效情况,这非常有用。可以将其视为评估电影中任何帧的有效性的一种方式。

如果您需要记录所有车辆的所有驱动程序,您需要进行许多更改。 Person实际上扮演Student(通常是其他角色)的角色,并且该角色可能会随着时间的推移而发生变化。您需要记录每个角色更改的开始和结束时间以及每个驾驶员/车辆更换的开始和结束时间。可以将其视为录制电影中的所有帧,但无法表达电影中任何给定帧的有效性。当你放松多重性时,你会失去这种能力。

您可以通过结合我提到的所有关联的所有来获得“单帧”和“整部电影”方法的好处。

答案 1 :(得分:1)

通过在*Student的{​​{1}}类附近使用0..1多重性,可以轻松解决问题。这将告诉读者两者都可以拥有相关的可选车辆。为了避免使用同一辆汽车,你需要附加一个这样的约束:

enter image description here

或者您可以通过以下方式执行此操作:

enter image description here

我不擅长编写OCL,但你也可以将约束正式化。