问题描述
让我们考虑一下Book
类和Chapter
类。
Class Book {
private Chapter chapter;
}
Class Chapter {
}
声明1 :如果Book
包含Chapter
,则这是组成,因为销毁Book
也会销毁{{ 1}}
声明2 :由于Chapter
与Book
相关联并知道Chapter
,因此它也可以是可导航性。
所以,两个语句都是正确的,我知道语句1是正确的,但是我不确定语句2是否正确。
解决方法
有成分和成分
使用相同的“组成”一词来指代非常不同的事物:
- object composition ,这是一种OOP技术,可以从多个其他对象和值中创建(组成)一个对象。
- UML composition ,这是一种关联,其中一个对象一次可以成为一个最大复合对象的一部分,并且复合对象负责存在和存储该复合对象。零件。因此,这是专有所有权。
顺便说一句,在回答之时,Wikipedia文章误导了关于对象组合的UML表示法的不完整之处:它完全错过了对象组合可以实现简单关联的观点
您的情况是对象组成
在您的示例中,您使用对象合成,Book
和组件对象Chapter
(提示:使其成为使您的示例更加逼真的容器)
不能保证它是UML组成:例如,如果此代码将用Java实现,则Book book
可以有私有的Chapter chapter
。但是book
的某些方法,例如getChapter()
,可能会将私有chapter
泄漏到另一个对象。由于java类是引用对象,因此,不能保证本章最多包含一个组合,这是UML组成的UML要求。而且,在这种情况下,一章可能会影响一本书。
建议:除非您确定专有,否则请避免编写UML。如有疑问,请为简单的关联建模。
可导航性
Navigability与关联类型正交。存在用于组合,聚合和简单关联的可导航性。这意味着您可以轻松地从一个类的实例转移到另一个类的关联实例。
在您的情况下:
- 您可以清楚地从组合
book
导航到组件chapter
(就像book.chapter
一样容易。) - 但是,没有任何向后导航的证据:因此,当您拥有特定的章节时,如果不了解其中所包含的书,就不可能找回相关的书。