我有两个类Person
和Department
,它们之间有两个关联
works
和manages
,在这两个关联之间有{subset}
(manages
个关联是works
关联的子集。
我应该推断出对象图?
Person
都有两个指向其部门的链接(一个用于works
,另一个用于manages
),或Person
经理只有一个链接到他的部门?顺便说一句,除了{subset}
,{nand}
,{and}
和{xor}
之外,是否还有其他约束符号可以放在类图中?
答案 0 :(得分:0)
由于您已定义了两个关联,因此对象将具有两个链接。就那么简单。如果works
具有非零多重性(因为它将具有manages
之一),您可以添加0..1
多余的注释。
您可以在关联之间放置任何您喜欢的约束 - 只要它们有意义。
第111页上的超结构2.5状态:
<prop-modifier>
表示适用于该属性的修饰符。
<prop-modifier> ::= ‘readOnly’ | ‘union’ | ‘subsets’ <property-name> | ‘redefines’ <property-name> | ‘ordered’ | ‘unordered’ | ‘unique’ | ‘nonunique’ | ‘seq’ | ‘sequence’ | ‘id’ | <prop-constraint>
答案 1 :(得分:0)
请注意,可以在关联结束(引用属性)之间定义subsets
约束,但不能在关联之间定义约束。所以,你的问题应该更好地陈述如下。鉴于具有两个参考专长Person
和managedDepartment
的课程department
,代表Person
和Department
之间的相应功能关联,约束
managedDepartment subsets department
意味着对于任何人对象p
,由p管理的部门集是p工作的部门集的子集或eqal。这正式规定了一个人只能是他工作的部门的经理的业务规则。象征性地,
p.managedDepartment subseteq p.department
或者,可以定义manages
关联专门针对worksAt
关联,这意味着对于任何manages
关联,都会有相应的worksAt
链接。
答案 2 :(得分:0)
这是我一段时间以来见过的最好的问题!直接回答你的两个问题:
Person
manages {subsets works for}
Department
,作为管理员的每个Person
都会有两个指向Department
的链接:一个用于works for
和manages
一个。{redefines}
。重新定义属性允许您更改属性的名称,并在其拥有类的上下文中(以及在子类的上下文中)收紧约束。例如,您可以说以下内容:
Deck
contains
0..52 Cards
Deck
的子类Monster Deck
仅contains {redefines contains}
0..10 Monster Cards
Deck
的另一个子类Player Deck
仅contains {redefines contains}
0..10 Player Cards
这对于表达要求和业务规则非常方便。