除了 UML 的上下文,如果 A 扩展了 B,那么 B 是 A 的子集。
但是在 UML 中,情况正好相反,比如说,如果 A 扩展了 B,那么 A 是 B 的子集,
为什么这么奇怪?
<<extend>>
依赖项仅用于用例。这意味着一个用例在某些情况下扩展了另一个用例。在下面的:
客户查看帐户详细信息。在某些情况下,客户还可以“查看未结订单”作为“查看账户详细信息”的一部分。客户也有可能将“查看历史记录”作为“查看帐户详细信息”的一部分。
这与泛化/专业化无关。
<<extend>>
在用例图中令人困惑。混淆的最小部分是用例图不是用例!
用例是文档,而不是图表。例如,上图可能来自以下用例文本:
扩展:
1a。如果客户点击“未结订单”链接,
客户查看未结订单
1b。如果客户点击“查看历史”链接
客户查看历史
在更详细的模型中,这些“扩展点”将列在图表的“查看帐户详细信息”用例元素中。但在我看来,这使图表非常混乱。
我首先通过阅读 Martin Fowler 的“UML Distilled”真正了解了 UML。我只是在发布这个答案之前检查了那本书,发现 Fowler 建议忽略<<extend>>
.
用用例来写它(我相信这是你的意思 - 如果不是,请纠正我),以免考虑在你最喜欢的快餐店点餐。
基本用例是点餐,但如果您出示折扣券,则可以扩展。每次您通过这种使用方式时,您都会得到一顿饭,但只有在特殊情况下您支付的费用才会比平时少(或获得额外的三明治)。
我在这里找到了一个很好的例子:http ://www.agilemodeling.com/essays/useCaseReuse.htm 。如您所见,国际学生的注册包括额外的安全检查,并且仅适用于一部分注册。希望这会有所帮助。
UML 不使用术语“扩展/扩展”。相反,它使用术语“泛化/泛化”;人们也经常将其称为“继承/继承”。
如果 B 是 A 的泛化(即 A 从 B 继承),那么 A 是 B 的子集。这应该从“is-a”关系中变得清楚:如果每个 A 都是 B,那么 A 显然是 B 的子集B. 用您的术语来说,如果 A 扩展 B,则 A 是 B 的子集。
类型是谓词:对于每个对象,您都可以确定它是否属于谓词。扩展谓词意味着使其更具限制性。