(原創) association,aggregation,composition有什麼差別? (OO) (UML) (C/C++)

class之間有三種關係,inheritance,implementation和association。inheritance和implementation在C++、C#、Java都有直接支援,所以不難懂,但association,aggregation和composition在語言並沒有知接支援,到底三者有什麼差別呢?

首先看association,下圖是個典型的assoication class diagram。



association的表示法是實線加上箭頭,有兩個重點,navigability和multiplicity,navigability就是箭頭指的方向,指別的class的,表示負責維護association關係,在此class中有data member存著被指class的reference(pointer),multiplicity則是上面的數字,離自己class比較遠的,表示對方class和自己class之間的關係,如上圖,1個School可以有多個Student,而1個Student只能有一個School,而一個Student可以選1到6個Course,1個Course可被1到多個Student選。

association常見的問題是,到底箭頭該怎麼指才對?一般來說,若是一對多的關係,是由一指向多,因為通堂一個class會有個array或vector儲存多個物件,但這並非絕對,只能說通常如此,如上圖的Student對Course是一對多,且Course對Student也是一對多,但他選擇了由Course負責association關係,所以完全看設計需要,實務上,建議如UML for Java Programmer中文版p.3-15那樣,加上stereotype,詳細的敘述是屬於哪一種association,將來我會再專文介紹。

若以C++表示,association的程式碼如下
1class A {
2  private:
3    B* itsB;
4}
;

再來看aggregation

aggregation的表示法由空diamond和箭頭表示(選的這張圖是比較舊的UML格式,所以沒有箭頭),空diamond表示whole,箭頭表示part。若以英文表示,就是has a的關係,上圖是典型一對多的表示法。

若以C++表示,aggregation的程式碼如下
1class Node {
2  private:
3    vector<Node*> itsNodes;
4}
;

最後是composition,表示法與aggregation的差異在於變成實diamond,其他完全一樣,跟aggregation在意義的差異在於composition強調『同生共死』,當System物件死亡時,Component物件也要跟著死亡,但aggregation是『生死有命』,當System物件死亡時,Component物件並不特別去處理。

若以C++表示,composition的程式碼如下
1class Car {
2  public:
3    virtual ~Car() {delete itsCarb;}
4  private:
5    Carburetor* itsCarb
6}
;

由以上程式可知,composition須由destructor去處理,而aggregation則不必。

在C#、Java這類有garbage collection的語言,composition幾乎不會用到,但在C++,只要用到pointer,就得自己去delete,所以在composition對於C++就很重要。


Reference
http://www.visualcase.com/kbase/associations.htm
http://ootips.org/uml-hasa.html
http://www.tomjewett.com/dbdesign/dbdesign.php?page=aggregate.php
UML for Java Programmer中文版 p.3-11 ~ p.3-13
UML Distilled 2nd中文版

posted on 2007-02-20 16:30 真 OO无双 阅读(8753) 评论(5) 编辑 收藏

评论

#1楼 2007-07-25 11:04 买福彩吧[未注册用户]

讲的非常透彻。  回复 引用   

#2楼 2007-12-29 13:11 fiona[未注册用户]

获益匪浅  回复 引用   

#3楼 2009-01-13 01:41 luxhit[未注册用户]

讲解的很好  回复 引用   

#4楼 2009-05-18 22:15 neochung[未注册用户]

板大說的composition=>同生共死
是否代表物件進行construct的時候就要建立
也就是說
constructor=> new Carburetor();
destructor=> delete itsCarb;
 回复 引用   

#5楼[楼主] 2009-05-19 00:03 真 OO无双      

--引用--------------------------------------------------
neochung: 板大說的composition=&gt;同生共死
是否代表物件進行construct的時候就要建立
也就是說
constructor=&gt; new Carburetor();
destructor=&gt; delete itsCarb;

--------------------------------------------------------

對 就是這樣
 回复 引用 查看   

导航

公告

emblem-2010

first2009-011

我是一個小小的數位IC工程師,從事SOC IP開發,業餘則喜歡研究FPGA、Embedded System、OS、MFC、NET與OOP相關技術。我並不是靠寫Blog或寫書維生,只是記下來怕自己忘記,所以不加任何廣告。所有文章與程式碼歡迎轉載使用。

昵称:真 OO无双
园龄:5年4个月
粉丝:281
关注:0

随笔分类(2100)