【问题标题】:How come this class in composition is shared?这门作文课是怎么共享的?
【发布时间】:2026-01-06 12:30:02
【问题描述】:

我知道在 UML 中,组合意味着一个类基本上包含具有生命周期依赖关系的另一个类,即当这个类被销毁时,组成类也被销毁。与聚合不同,类不共享。 但后来我看到了——在系统设计者大会上,这个:

[A Plane]<>COMPOSITION---------[Passenger]0,1--------<>[Seat] 

这意味着如果飞机被摧毁,所有乘客都被摧毁(到目前为止是正确的)但乘客随后与座位处于聚合(或关联)关系,其中每组可以有 0 或 1 名乘客。但是在这种情况下,不是共享乘客吗? 在现实中使用现代语言(例如 C#),如果只有 Seat 持有对乘客的引用,它仍然存在,无论 Plane 类被销毁。

【问题讨论】:

    标签: class oop uml class-diagram ambiguity


    【解决方案1】:

    这些类之间关系的更好表达是座位(不是乘客)是飞机组成的一部分,而乘客与座位关联。有座位的乘客聚集在技术上会表达更强的关系,但关联似乎是更自然的(即“现实世界”)关系。当飞机被“摧毁”时,座位也被“摧毁”,但乘客“活着”,他们与模型其他部分的关联也是如此,例如航班行程另一段的另一架飞机上的座位。

    【讨论】:

    • 那么这不是违反构图原则吗?因为它是 1) 共享的 2) 在组合类被销毁后仍然存在。这怎么可能是正确的?但是在系统设计师会议上……我不明白。就是这样 - 飞机由乘客组成,每个乘客都与一个座位相关联(或不 - 0..1)
    • 是的,我同意你的看法。我认为这是一个不正确的模型。飞机不是由乘客组成的……乘客只是通过与座位的关联而与它相关联。发生这些类型的建模错误的一个原因是人们忘记了让他们的模型立足于现实世界。模型应该表达真实、自然的关系。我想这个故事的寓意是不要相信你在会议上听到的一切:-)