我正在回顾我在面向对象编程方面的知识。在类主题之间的关系下,我遇到了一些对我来说有点模棱两可的关系。
我知道依赖“使用-a”和继承“是-a”但我对聚合,组合,关联和直接关联有点不熟悉;还有,他们中的哪一个是“有一种”关系。有些人使用Aggregation与Association互换。
什么是直接协会?还有什么是作文?在UML图中,表示它们的箭头是不同的。如果你能为我清除这些事情,我将非常感激。
请注意,对“关联”定义有不同的解释。我在下面的观点很大程度上取决于您在Oracle认证书籍和学习指南中的内容。
方法内部的用法,其签名或作为返回值。它并不是对特定对象的引用。
示例:我将车停在车库。
所谓的“STRONG关系”:链接对象的实例化通常在对象的构造函数内部进行硬编码。它不能从对象外部设置。 (构成不能是多对多的关系。)
示例:房屋由石头组成。
这是一种“弱关系”。对象可以独立存在,并且通常有setter或其他方式来注入依赖对象。
示例:汽车可以有乘客。
非常类似于直接关联。它也是与独立物体的“弱关系”。但是,这里关联的对象是包含对象的关键部分。
示例:汽车应该有轮胎。
注意:直接关联和聚合关联通常都被概括为“关联”。差异相当微妙。
OOP的重点是您的代码复制现实世界的对象,使您的代码可读和可维护。
1.协会
协会是:A类使用B类。
例:
在In UML图中,Association由正常的箭头表示。
2.聚合
A类包含B类,或A类具有B类实例。
当对象的生命与容器对象无关时,使用聚合。但仍然容器对象拥有聚合对象。
因此,如果我们删除A类并不意味着B类也将被删除。例如。没有或许多教师可以属于一个或多个部门。
教师和部门之间的关系是聚合的。
3.组成
A类拥有B类。
例如。身体由手臂,头部,腿部组成。 BankAccount由Balance和TransactionHistory组成。
因此,如果A类被删除,那么B类也将被删除。
直接关联与其他三个没有任何共同之处。它根本不属于UML,它是IBM requirements modelling term。
至于其他人,
关联A-> B是依赖的孩子。关联意味着,A(或其实例)有一些简单的方法来获取B的实例。例如,a.x.y.b。或者通过函数,或者通过一些局部变量。或者通过直接引用或指针,或其他东西(世界上有许多语言)。如您所见,依赖关系和关联之间没有严格的边界。
关联的一个属性是聚合,它可以具有以下值:无,共享(通常错误地称为聚合)和组合。
如果A(或实例)具有B的某些(或一个)实例,则破坏关联意味着破坏B实例,它就是组合。
如果您或工具作者已经决定,某些人有一种关系,那个组合较弱,需要特别展示,您可以使用shared
聚合。通常它是A中B的一些引用集合。
关联有一些更有趣的属性。如果你有兴趣,请查看here。
对象类型之间的关联对这些类型的对象之间的关系进行分类。例如,关联Person
-isEmployedBy-Enterprise
可以分类关系PeterMiller-isEmployedBy-IBM,SusanSmith-isEmployedBy-IBM和SarahAnderson-isEmployedBy-Google之间的对象PeterMiller,SusanSmith和SarahAnderson类型Person
以及Google和IBM的类型Enterprise
。换句话说,关联是具有两个或更多参与其中的对象类型的关系类型。两个对象类型之间的关联称为二进制。虽然二元关联更常见,但我们可能还必须处理n元关联,其中n是大于2的自然数。例如,Person
-isTreatedIn-Hospital
-for-Disease
是3-ary(“三元”) )对象类型Person
,Hospital
和Disease
之间的关联。
我猜这与“直接关联”你的意思是一个方向(或定向)关联,它是一个关联(与域类和范围类),表示其域类中的引用属性。这种方向关联在其目标端具有“所有权点”。
有关协会的更多信息,请参阅this book chapter。
并查看我对this SO question的回答,以解释聚合和组合。