基数和泛化在 UML 中如何工作?

How do Cardinalities and Generalization work in UML?

我试图了解基数和关系如何在简单的 UML class 图中与泛化一起工作。我这里有这个简单的例子:

一个玩家恰好拥有 9 个场地,但它们的分布无关紧要(即 5 个端场、4 个起点或 1 个终点和 8 个起点)。字段 class 是抽象的。如果我像上面看到的那样对这个问题进行建模,那么玩家会从每种类型中获得 9 个字段吗?如果是这样,我该如何正确建模?

If i model this problem as seen above, would a Player have 9 Fields from each type?

不是同时。在你的模型中,一个 Player 与 9 个 Fields 相关联,知道每个 Field 是一个 Endfield 或者 - 独占一个 Startfield (假设没有其他 classes 继承字段)

Field 的给定实例不能同时是 EndfieldStartfield,否则这意味着 Fields 继承了两者 StartfieldEndfield(但继承方向相反)

您的模型 Java 中对应的 classes 可以是:

abstract class Field { .... }
class Startfield extends Field { ... }
class Endfield extends Field { .. }

所以一个Player可以与9个Endfields相关联,或者不包括8个Endfields and 1 Startfield, or-exclusive 7 Endfields and 2 Startfield, ..., or-独占 1 Endfield 和 8 Startfields,或独占 9 Startfields

如果你想要一个 Player 有 9 个 Startfields 和 9 个 EndFields 你的模型可以是:


[编辑]

但是,如果您扩展模型,添加另一个 class 继承 StartfieldEndtfield,例如:

如果 Player 在某种程度上与 9 Bothfields 关联,它也与 9 Startfield 和 9 Endtfield

关系的多重性 (9) 涉及 Field,如您所见

所依赖的继承 classes

除了 您需要向 Endfield-Startfield 分段添加不相交约束(称为"generalization set"(UML 术语)用于确保一个字段不能既是结束字段又是开始字段。

从 UML 2.5 开始,分段默认是重叠的(并且不完整)。另请参阅 uml-diagrams.org 上的(总是很好的)解释,其中显示了如何绘制不相交约束。