上下文:我有一个抽象类Student。从这个类中,我派生出三个具体的类-- SchoolStudent,UnderGradStudent,UnderGradStudent我还有一辆车辆。一名在校学生必须是而不是驾驶一辆车,然而,一名本科生或一名研究生可能驾驶vehicle.But,也可能不驾驶vehicle.But--每一辆车都必须由某人驾驶,因此 vehicle 类指的是学生。
问题:我有、UnderGradStudent和Vehicle类之间的关联,以及PostGradStudent和Vehicle之间的另一个关联。然而,我对这种多样性感到有点困惑。
就我所理解的问题而言,UML类图应该如下所示:

然而,我怀疑上面的图表表明,每个UnderGradStudent车辆将有一个PostGradStudent.和一个PostGradStudent.。
上面的图表对我想要的对应上下文的模型是正确的吗?
发布于 2015-10-02 02:41:44
正如您已经绘制了这个UML图一样,它暗示(但没有正确地说) Vehicle必须同时由一个UnderGradStudent和一个PostGradStudent驱动。它还意味着UnderGradStudent可以驱动任意数量的Vehicle,PostGradStudent可以驱动任意数量的Vehicle(同时)。我不认为这是你的本意。我之所以说“暗示”,是因为你在一端覆盖了两个联想。最后我检查了一下,那是无效的UML。
我想您想说的是,Vehicle可能由最多一个Undergrad Student或Postgrad Student驱动。为此,我建议采用以下模式:

上面写的是:
Student的有效实例必须是School Student、Undergrad Student或Postgrad Student的实例(而不是乘法分类)。Allowed Driver的有效实例必须是Undergrad Student或Postgrad Student的实例(且不能乘以分类)。Vehicle可以由最多一个Allowed Driver驱动(一次)Allowed Driver最多可驱动一个Vehicle (一次)这描述了一个有效的情况,在任何时候,这是真正有用的。把它看作是一种评估电影中任何帧的有效性的方法。
如果你需要记录每一辆车的所有司机,你需要做很多改变。Person实际上扮演着Student的角色(通常是其他角色),这个角色可能会随着时间的推移而改变。您需要记录每个角色更改的开始和结束时间以及每个司机/车辆更改的开始和结束时间。把这看作是记录电影中的所有帧,但是没有能力表达电影中任何给定帧的有效性。当你放松多重性时,你就失去了这种能力。
通过合并我提到的所有关联,您可以获得“单帧”和“整部电影”方法的好处。
发布于 2015-10-02 13:51:54
通过在*Student类附近使用Vehicle中的0.1多重性,您的问题将很容易解决。这将告诉读者,两者都被允许拥有相关的可选车辆。为了避免同时使用同一辆车,您需要附加如下约束:

另外,你也可以这样做:

我不擅长写OCL,但您也可以将约束正规化。
https://stackoverflow.com/questions/32897854
复制相似问题