关联、聚合和组合的表示方式是什么?

6

我已经阅读了一些关于这3种关系之间差异的文章,我想我明白了重点。

我只是想知道,在编码时,它们是否都是相同的写法?

问题1:这3种关系都只是实例变量中对象类型的值吗?

class A {
    public $b = ''

    public function __construct($object) {
         $this->b = $object // <-- could be a association, aggregation or a composition relation?
    }
}

问题2:它必须是实例变量还是可以是静态变量?
class A {
    public static $b = '' // <-- nothing changed?

    public function __construct($object) {
         $this->b = $object
    }
}

问题3:对象创建的位置有区别吗?
我倾向于认为组合对象是在对象内部创建的:
class A {
    public $b = ''

    public function __construct() {
         $this->b = new Object // is created inside the object
    }
}

并聚合/关联通过构造函数或另一个方法传递:

class A {
    public $b = ''

    public function __construct($object) { // passed through a method
         $this->b = $object
    }
}

问题4:为什么/何时知道这很重要。我是否必须在另一个对象内注释其关系,还是在UML图表中进行?能否有人解答这些问题?
3个回答

6
您是正确的,这些关系通常被实现为对象引用,当然通常只是某个类的成员字段。这仅因为在面向对象系统中很自然,但在不同的上下文中,例如关系数据库中,它可以映射到其他东西。
如@erisco所提到的,关系的具体内容只能从整个模型的上下文中得出。例如,我们可以将购买订单和订单行之间的组合关系解释为:一个购买订单由一个或多个订单行组成。
我通常按以下方式解释您给出的三个关系:
1. 关联:A知道B的存在,B本身具有意义。 2. 聚合:A包含B,B是外部可识别且可以独立存在的。 3. 组合:A包括B,B不能从外部识别或在此组合之外没有意义。
话虽如此,我见过这些术语被用来表示几乎任何可以想象的东西(很可能有人在SO上会不同意我的评估!),因此在解释他人的图表时要小心。以上约定对我很有用,但你可能不适用。
至于第二个问题:静态引用会产生跨实例的共同关联,但这只是一种实现方式,可能会让使用者感到惊讶。

编程语言本身无法解释两个对象之间的关系。它只在UML图中显示,以便我们程序员了解这些对象之间的关系,对吧?因为我想知道是否有一种特定的编码方式来表示这些关系,但似乎并非如此。这些关系应该在代码中作为注释还是仅在UML中呈现? - never_had_a_name
请查看此文章:https://www.dariawan.com/tutorials/java/association-aggregation-and-composition-in-java/ - Андрей Русев

2

维基百科:类图可能有最好的定义。你提供的例子没有区分关联、聚合或组合。如果没有对A或B是什么的定义,也就没有它们之间关系的定义。如何获取对另一个对象的引用与类图无关。


0

正如在php.net中明确说明的那样:

关联是由独立构建和外部可见的部分组成的。当我们关联类或对象时,每个类都会保留对其关联类的引用。

当我们以静态方式关联类时,一个类将包含对另一个类实例的引用。

我们还可以通过在构造函数(或任何其他方法)中传递引用来在运行时关联实例,这使我们能够动态更改对象之间的关联关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接