两个组合可以拥有同一个对象吗?

Can two compositions own the same object?

我正在尝试为在线拍卖系统制作 class 图表,但我遇到了这个问题。出价属于拍卖和买家(如果我错了请纠正我)。那么我可以说 User 由 bid 组成,而 auction 由 Bid 组成,或者这是否违反 UML 规则?我很困惑

你了解过 UML 中的关联 类 吗?它们表示一个对象,该对象是根据另外两个 类 之间的关系创建的,正是您要映射的对象。有很多内容详细说明协会类(例如

这样你就不会在阅读图表时感到困惑(顺便说一句,你做对了),你会很清楚实体 Bid 的存在,它只与 Buyer 和 Auction 相关联。

一般

术语组合含糊不清,这解释了您的困惑:

  • 在 OOP 中,object composition 表示在另一个对象中使用一个对象。
  • 在 UML 中,composition 是一种特殊的关联,表示部分与整体的关系,整体对部分具有排他性所有权。

所以在 UML 意义上,不可能有一个对象是两个不同组合的一部分,因为所有权将不再是排他的。但是您可以在多个 aggregations 中使用该对象,它们是允许共享所有权的整体-部分关系。

在 OOP 的意义上,在(或使用)多个组合中使用相同的对象是没有问题的。对象组合对应一个navigable UML association.

在您的实际案例中

情况很简单:一个Bid有一个Buyer,一个Buyer可能有几个Bids,一个Auction有几个Bids。您可以使用简单的关联对其进行建模:

您也可以在这里使用聚合,因为有人可能会争辩说 Auction 和相应的 Bids 之间存在整体-部分关系(就个人而言,我不认为它像这个):

然而,您不应该在另一侧看到聚合,因为 BuyerBid 之间没有真正的整体-部分关系:Buyer 不是 "made of several Bids"。

补充说明

您也可以在此处使用关联 class。但这不是必需的。并且语义会有所不同:这意味着 BuyerAuction 之间存在 Bid 关联:

  • 从技术上讲,您仍然有三个 classes。
  • 但重点不同:BidBuyerAuction 的附属物,不能单独存在(例如,如果买家消失)