上一篇文章中說明了類結(jié)構(gòu)圖的基本畫法。要真正要完成實(shí)用的類圖,還要有許多工作要做。
類之間的關(guān)系
繼承關(guān)系
繼承關(guān)系是最容易理解的關(guān)系。畫成圖的話就像下面這樣。面向?qū)ο蟮恼f法就是is-a關(guān)系。也就是說Class2 is a Class1。在C++中我們說Class2是Class1的派生類,或者說Class1是Class2的基類。
聚集和組成
從容易理解的關(guān)系說起.經(jīng)常有一個類是另一格類的數(shù)據(jù)成員的情況。在UML中表現(xiàn)為,聚集(aggregation)和組成(composition)。

從圖上來看,這兩種關(guān)系都表現(xiàn)為一端是菱形的直線。其中有菱形的一端是整體,另外一端是部分。區(qū)別就是菱形是空心還是實(shí)心的。從C++曾序來看的話,如果圖畫成實(shí)心菱形的話,Class1就要負(fù)責(zé)Class2的創(chuàng)建和銷毀。更準(zhǔn)確的說,就是如果Class1不存在了,Class2也一定不存在。例如象下面的程序。
class Class2
{
};
class Class1
{
Class2 m_objClass2;
}
當(dāng)然也有下面的情況
class Class2
{
};
class Class1
{
Class1();
~Class1();
Class2* m_pClass2Obj;
};
光看類的聲明就不行了。這是就需要看類的實(shí)現(xiàn)部分了。
Class1::Class1()
{
m_pClass2Obj = new Class1;
}
Class1::~Class1()
{
delete m_pClass2Obj;
m_pClass2 = NULL;
}
組成(Composition)關(guān)系,如果在Class1的對象銷毀的時候,比如在析構(gòu)函數(shù)中沒有將數(shù)據(jù)成員銷毀的代碼,那么這種關(guān)系就是聚集(aggregation)關(guān)系。當(dāng)然,銷毀數(shù)據(jù)成員的代碼,會有很多種。
依賴關(guān)系
依賴關(guān)系就是在以個類中使用了另一個類。例如下面的代碼
Class1::DoSomething()
{
Class3 obj;
obj.DoClass3Work();
}
就是這樣的情況。畫成圖的話就像下面這樣。
