双向关联和单向关联 UML

14

虽然我认为我理解了聚合组合,但我仍然难以理解双向单向关联。 我读到说,双向关联是指两个类互相知道对方,而单向关联只有一个类知晓关系。然而,这种解释对我来说似乎太抽象了,我想知道这对我的代码和正在编写的程序特别意味着什么。 如果您能够在解释的同时提供一个简单的示例,那就太好了。 (我更喜欢C++代码,但它可以是任何东西,包括伪代码)


你可以在 http://sourcemaking.com/refactoring/change-bidirectional-association-to-unidirectional 和 http://etutorials.org/Programming/UML/Chapter+4.+Class+Diagrams+The+Essentials/Associations/ 中找到一些示例。 - Mihai8
2个回答

30

双向关联可以从两端导航。例如,给定以下类(为简单起见,假设两端的关联为0..1)

class Parent {
  Child* children;
}

class Child {
  Parent* parent;
}

你可以从一个 Parent 转到它的子元素,反之亦然:父元素知道它的子元素,子元素知道它的父元素,并且(如果 this.parent!=nullthis.parent.child==this(否则它们不是同一关联)。

Parent <---------> Child

然而,如果在Child中没有指向Parent的指针:

class Child { }

这将是一种单向关联:你可以从父级到子级,但无法从子级返回父级。

Parent ----------> Child

2
谢谢您对“双向”和“单向”关联之间差异的澄清,但我现在有第二个问题。到目前为止,我认为拥有一个指向关联类的成员指针/引用是聚合的一种实现方式,但是您的代码示例也使用了指针。这是否意味着聚合和关联在代码中的实现方式相同? - jcxz
1
是的,聚合更像是模型的一个概念元素。我记得我们在http://stackoverflow.com/questions/15285996/do-pointer-reference-data-members-indicate-an-association-or-aggregaation-relati/15294388上讨论过这个问题。 - Javier
4
非常感谢,现在我完全明白了。 因此,总结我的发现: 关联(association)、聚合(aggregation)和组合(composition)是比较语义化的概念,它们基本上可以用非常相似的方式实现。 此外(对于那些将来可能遇到这个线程的人),我发现了这篇帖子:https://dev59.com/m2855IYBdhLWcg3wg0rC,它阐明了这三者之间的语义差异。 - jcxz
现在我知道了什么,但我想知道为什么,如果可以双向的话,似乎没有单向的理由。 - Alex Thai

1

不幸的是,UML规范并没有定义任何“双向关联”的概念,而只提到了“双向可导航性”,其中“可导航性”(在类图中用箭头表示)没有明确定义的计算含义,因为它可以通过引用属性或查询来提供。最有效的“可导航性”形式由引用属性提供,并使用UML概念关联端所有权(在类图中用表示)进行建模。

双向关联可以精确地定义为一对相互反转的引用属性。该定义意味着两个条件:

  1. 对于引用子项的thisthis.parent.child == this,如Javier的不完整答案所解释的那样,但此外还有

  2. 对于引用父项的thisthis.child.parent == this

你可以在教程中了解更多关于双向关联的信息,并找到许多类图来描述双向关联的示例。 Java EE 中管理双向关联JavaScript 中管理双向关联

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