虽然我认为我理解了聚合
和组合
,但我仍然难以理解双向
和单向
关联。
我读到说,双向
关联是指两个类互相知道对方,而单向
关联只有一个类知晓关系。然而,这种解释对我来说似乎太抽象了,我想知道这对我的代码和正在编写的程序特别意味着什么。
如果您能够在解释的同时提供一个简单的示例,那就太好了。 (我更喜欢C++代码,但它可以是任何东西,包括伪代码)
虽然我认为我理解了聚合
和组合
,但我仍然难以理解双向
和单向
关联。
我读到说,双向
关联是指两个类互相知道对方,而单向
关联只有一个类知晓关系。然而,这种解释对我来说似乎太抽象了,我想知道这对我的代码和正在编写的程序特别意味着什么。
如果您能够在解释的同时提供一个简单的示例,那就太好了。 (我更喜欢C++代码,但它可以是任何东西,包括伪代码)
双向关联可以从两端导航。例如,给定以下类(为简单起见,假设两端的关联为0..1)
class Parent {
Child* children;
}
class Child {
Parent* parent;
}
你可以从一个 Parent
转到它的子元素,反之亦然:父元素知道它的子元素,子元素知道它的父元素,并且(如果 this.parent!=null
)this.parent.child==this
(否则它们不是同一关联)。
Parent <---------> Child
然而,如果在Child
中没有指向Parent
的指针:
class Child { }
这将是一种单向关联:你可以从父级到子级,但无法从子级返回父级。
Parent ----------> Child
不幸的是,UML规范并没有定义任何“双向关联”的概念,而只提到了“双向可导航性”,其中“可导航性”(在类图中用箭头表示)没有明确定义的计算含义,因为它可以通过引用属性或查询来提供。最有效的“可导航性”形式由引用属性提供,并使用UML概念关联端所有权(在类图中用点表示)进行建模。
双向关联可以精确地定义为一对相互反转的引用属性。该定义意味着两个条件:
对于引用子项的this
,this.parent.child == this
,如Javier的不完整答案所解释的那样,但此外还有
对于引用父项的this
,this.child.parent == this
。