在面向对象编程中,两个或多个类之间可以存在许多不同类型的关系。 最常见的两种类型是:
· 继承-"是"关系
· 包容-一种"有"关系
该博客将深入探讨两种包容关系-聚合和组合。
什么是包容关系?
两个类之间的关联关系是"具有"关系。 例如:
· 汽车有引擎和车轮
· 一个人有一条腿和一条胳膊
· 一本书有页
这通常表示何时存在两个类,即A类和B类,并且其中一个:
· Class包含Class作为属性,或者
· 类的实例在类内部构造
聚合与组合有什么区别?
关联关系有两种子类型-聚合和组合。 两者有什么区别?
组合
组合意味着所包含的类不能独立于容器而存在。 如果容器被破坏,孩子也将被破坏。
以一本书和一本书为例。 没有书就不能存在该页面,因为书是由页面组成的。 如果Book被销毁,Page也将被销毁。
在代码中,这通常是指在容器类内部创建的子实例:
class Book: def __init__(self): page1 = Page('This is content for page 1') page2 = Page('This is content for page 2') self.pages = [page1, page2]class Page: def __init__(self, content): self.content = contentbook = Book() # If I destroy this Book instance, # the Page instances are also destroyed
聚合
通过聚合,子级可以独立于父级而存在。
因此,考虑到汽车和发动机,在销毁汽车时不需要销毁发动机。
class Car: def __init__(self, engine): self.engine = engineclass Engine: def __init__(self): pass engine = Engine()car = Car(engine) # If I destroy this Car instance, # the Engine instance still exists
这些如何表示UML图?
在UML图表中,聚合和组合都在类之间用菱形箭头表示。 钻石末端在容器的侧面。
· 组合使用裸钻
· 聚合使用封闭式钻石
这是一个例子:
希望这对您有所帮助!
(本文翻译自Anna Azzam的文章《Aggregation vs. Composition in Object Oriented Programming》,参考:https://medium.com/swlh/aggregation-vs-composition-in-object-oriented-programming-3fa4fd471a9f)