假设我在UML类图中有A ---r1 {bag} [1..2]--> B
(也就是说,r1是从A到B的关联,并用{bag}和multiplicity [1..2]注释。
我的问题:如果a:A是A的实例,以下集合是否有效?
a.r1 = {(b1,1),(b1,2),(b2,1)} //集合包含两个副本b1和一个b2
换句话说,多重边界(即[1..2])适用于关联时纯粹被解释为r1:A - > B,或它适用于r1:A - >袋(B)?在前面的解释中,上面的集合是有效的,因为r1最多包含两个B的实例,但是后者则不包含,因为r1包含三个Bag(B)元素!哪种解释是对的?
我在UML document中提到的this question的第7.5.3节中解释了UML中的多重性约束。
p.s.1:当我们用{seq}替换{bag}时会出现类似的问题。
p.s.2:我添加了haskell标签来获取大型haskell社区的评论,就像@xmojmr建议的那样。感谢@peter在他的回答中很好地绘制了图片。
答案 0 :(得分:3)
如规格中所述,Bag是无序的,非独特的收藏品。 但是,这描述了您指向的元素之间的关系。
所以你的例子可以用任何一种方式表达:
这意味着A引用了一个到两个 B实例,并且这些引用存储在Bag(或任何非唯一,未排序的集合中;但这是实现细节)。
回答你的问题:不,因为Bag包含三个B实例,而允许的最大值是两个B.