聚合/组合与定向聚合/组合?

ork*_*kan 2 c++ diagram uml

bouml 中的聚合/组合和定向聚合/组合有什么区别?

除了 bouml 和 bouml 在其站点中没有解释外,其他地方找不到定向聚合/组合概念。

注意:基于代码的解释会好得多。

Chr*_*phe 5

根据BOUML UML 工具箱站点使用的措辞,“定向”必须理解为“单向”(与“双向”相反):

聚合:要定义双向聚合,代码生成器将生成两个名称为角色名称的属性。这种关系可以被认为是定义两个(定向)聚合的捷径。

因此,这个“定向”术语指的是相关对象之间的导航可能性。为了进行比较,在 MSVC2015 中,您可以在关联的“可导航”属性中找到方向的概念。

因此,单向聚合可以是例如:

class Member { ... };  // member of a club 
class Club {
   list<Members*> members; // you can go from Club to Members but not the contrary. 
   ...
};
Run Code Online (Sandbox Code Playgroud)

双向聚合应该是这样的:

class Club; 
class Member {   // member of a club 
    list<Club*> clubs;  // club to which a membershib relation exist.  
    ...
};
class Club {
   list<Members*> members; // you can go from Club to Members and now back. 
   ...
};
Run Code Online (Sandbox Code Playgroud)

对于无方向的组合,我们可以有例如:

class Element { ... };  // Elemetn doesn't know parent (=> unidirectional)
class Object {
    vector<Element> element; // own by value for example
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

或者:

class Element { ... }; 
class Object {
    vector<unique_ptr<Element>> element; // ownnership by unique pointer 
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

双向组合可能是这样的:

class Object; 
class Element {
    Object *parent;    //  you can navigate back (Element knows about parent)
    ...
 }; 
class Object {
    vector<Element> element; // own by value for example
    ...
}; 
Run Code Online (Sandbox Code Playgroud)