我有一个父用例。我不想让用户使用父用例。我只希望用户可以访问子用例。将其视为 Java 中的抽象类。你永远不能实例化一个抽象类。用例图允许这种行为吗?
4 回答
@observer 的答案几乎是完美的(我已经 +1 了 :)),除了他没有完全回答你的问题。
在您的情况下,您可能会做的事情如下:
Actor0
将设法Pay bill
,无论是Pay with credit card
或Pay with PayPal
。- 另一方面,
Actor1
将只能Pay with credit card
。
意思是:
- 使用泛化来建模“父”用例与其“子”之间的关系。
- 让您想要“访问”的参与者只有一个孩子,只与那个用例相关联。
是的,可以有“父”或“子”用例。用于对这种关系建模的连接器称为generalization
. 请参见此处:用例泛化与扩展此处还给出了一个包含图表的示例。
请注意:如果您对一个用例进行泛化建模,那么这与一个用例不同(!)<<extend>>
。
您可以在文本用例描述中添加有关调用约束的注释。
是的!(也是最终的,因为 UseCase 是分类器的特化)。
引用统一建模语言 (OMG UML),上层结构:
概括
UseCase(来自 UseCases)专门研究BehavioredClassifier(来自 BasicBehaviors,Communications)。
BehavioredClassifier专门用于分类器(来自 Kernel、Dependencies、PowerTypes、Interfaces)。
属性:分类器具有以下属性:
isAbstract:布尔值(如果为真,则分类器不提供完整的声明,通常无法实例化)。
isFinalSpecialization : 布尔值(如果为真,分类器不能通过泛化来特化)。
约束:分类器只能专门化有效类型的分类器。
self.parents()->forAll(c | self.maySpecializeType(c))
附加操作
查询maySpecializeType()
确定此分类器是否可能与指定类型的分类器具有泛化关系。默认情况下,分类器可以专门化相同或更通用类型的分类器。
Classifier::maySpecializeType(c : Classifier) : Boolean;
maySpecializeType = self.oclIsKindOf(c.oclType)
最后但并非最不重要的一点是,即使它说maySpecializeType()
“旨在由具有不同专业化约束的分类器重新定义”......maySpecializeType()
对于UseCase或BehavioredClassifier没有重新定义。
来源:统一建模语言 (OMG UML),上层结构,版本 2.4.1。
你的术语有点不对劲,但总的来说答案是肯定的。
没有“父”或“子”用例之类的术语。通常,用例是由用户触发的行为。您似乎需要的是由include
基础和包含的用例之间的关系来描述的。它用于提取公共功能块以供不同用例重用。例如:
在此处查看更多信息:用例图中的包含和扩展有什么区别?