一个类与两个类存在关联时的多对一多重性

问题描述 投票:0回答:2

上下文:我有一个抽象类Student。从这个类中,我派生出三个具体类SchoolStudent、UnderGradStudentPostGradStudent。我还有另一堂课车辆。学校学生必须驾驶车辆,但是本科生或研究生可能会也可能不会驾驶车辆。但是每辆车都必须由某人驾驶,因此车辆类引用了学生。

问题:我在 UnderGradStudent 和 Vehicle 类之间存在关联,并且在 PostGradStudent 和 Vehicle 之间存在另一个关联。然而,我对多重性有点困惑。

据我了解这个问题,UML 类图应该看起来像这样:enter image description here

但是,我怀疑上图表明每辆车辆将有一个UnderGradStudent以及一个PostGradStudent

上图对于我想要根据上下文建模的内容是否正确?

uml associations class-diagram multiplicity
2个回答
3
投票

当您绘制此 UML 图时,它暗示(但没有正确表述)

Vehicle
必须由一个
UnderGradStudent
和一个
PostGradStudent
驱动。它还意味着
UnderGradStudent
可以驱动任意数量的
Vehicle
,并且
PostGradStudent
可以(同时)驱动任意数量的
Vehicle
。我不认为这就是你的意图。我说“暗示”的原因是你在一端重叠了两个关联。最后我检查了一下,这是无效的 UML。

我认为您想说的是,一个

Vehicle
最多可以由一个
Undergrad Student
Postgrad Student
驱动。这么说来,我推荐以下型号:

Corrected Diagram

这句话的意思是:

  • Student
    的有效实例必须是
    School Student
    Undergrad Student
    Postgrad Student
    之一(并且不能多重分类)
  • Allowed Driver
    的有效实例必须是
    Undergrad Student
    Postgrad Student
    之一(并且不能多重分类)
  • 一个
    Vehicle
    最多可由一个
    Allowed Driver
    (一次)驱动
  • 一辆
    Allowed Driver
    最多可驾驶一辆
    Vehicle
    (一次)

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

如果您需要记录永远每辆车的所有驾驶员,您将需要进行许多更改。 A

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

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


2
投票

通过在

*Student
中的
Vehicle
类附近使用 0..1 重数可以轻松解决您的问题。这将告诉读者,两者都可以拥有相关的可选车辆。为了避免两者使用同一辆车,您需要附加这样的约束:

enter image description here

您也可以按照以下方式进行:

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.