UML中類之間的關(guān)系分為以下幾種:依賴、關(guān)聯(lián)、泛化、聚合、組合。
依賴是指一個(gè)類使用了另一個(gè)類,它是一種使用關(guān)系,描述了一個(gè)事物的規(guī)格說明的變化可能會(huì)影響到使用它的另一個(gè)事物(反之不一定)。最常見的依賴關(guān)系是一個(gè)類內(nèi)部中使用到了另一個(gè)類的定義。在UML中表示為一條指向被依賴事物的虛線。
依賴可以采取多種方式來實(shí)現(xiàn),如以下代碼
internal
class
DependReturnType
{
}
internal
class
DependParameter
{
}
internal
class
DependVarible
{
}
class
Depend
{
public
DependReturnType Test(DependParameter param)
{
DependVarible var
=
new
DependVarible();
return
new
DependReturnType();
}
}
Depend類依賴于DependReturnType類、DependParameter類和DependVarible類,這就表明依賴的關(guān)系可以通過返回值、方法參數(shù)或者內(nèi)部定義變量的形式來實(shí)現(xiàn)。
當(dāng)類之間在概念上有連接關(guān)系時(shí),類之間的連接稱之為關(guān)聯(lián),關(guān)聯(lián)是一種結(jié)構(gòu)關(guān)系,說明一個(gè)事物的對(duì)象與另一個(gè)事物的對(duì)象相聯(lián)系。給定一個(gè)連接兩各類的關(guān)聯(lián),可以從一個(gè)類的對(duì)象導(dǎo)航到另一個(gè)類的對(duì)象。
一般把關(guān)聯(lián)畫為連接相同或者不同的類一條實(shí)線。關(guān)聯(lián)可以有方向,即導(dǎo)航。一般不作說明的時(shí)候,導(dǎo)航是雙向的,不需要在線上標(biāo)出箭頭。大部分情況下導(dǎo)航是單向的,可以加一個(gè)箭頭表示。
關(guān)聯(lián)一般采取全局變量的方式來實(shí)現(xiàn),如以下代碼

Code
internalclass Employee
{
publicvoid DoWork()
{
}
}
class Association
{
private Employee myEmployee;
public Employee MyEmployee
{
get
{
return myEmployee;
}
set
{
myEmployee = value;
}
}
publicvoid DoSomething()
{
myEmployee.DoWork();
}
}
Association類關(guān)聯(lián)Employee類。
依賴和關(guān)聯(lián)都是一個(gè)類中使用了另一個(gè)類,那它們有什么區(qū)別呢?
依賴和關(guān)聯(lián)都是兩個(gè)或多個(gè)相對(duì)獨(dú)立的類之間的關(guān)系。當(dāng)一個(gè)對(duì)象負(fù)責(zé)構(gòu)造另一個(gè)對(duì)象的實(shí)例,或者依賴另一個(gè)對(duì)象的服務(wù)時(shí),這兩個(gè)對(duì)象之間主要體現(xiàn)
為依賴關(guān)系;當(dāng)一個(gè)對(duì)象的實(shí)例與另一個(gè)對(duì)象的一些特定實(shí)例存在固定的對(duì)應(yīng)關(guān)系時(shí),這兩個(gè)對(duì)象之間為關(guān)聯(lián)關(guān)系。依賴關(guān)系表現(xiàn)在局部變量,方法的參數(shù),以及對(duì)
靜態(tài)方法的調(diào)用;關(guān)聯(lián)關(guān)系是使用實(shí)例變量來實(shí)現(xiàn)。
泛化就是面向?qū)ο笾械睦^承。它表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對(duì)接口的實(shí)現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。
代碼如下

Code
internalclass Father
{
}
internalclass Child : Father
{
}
class Generalization
{
publicvoid Test()
{
Father father =new Child();
}
}
當(dāng)對(duì)象A被加入到對(duì)象B中,成為對(duì)象B的組成部分時(shí),對(duì)象B和對(duì)象A之間為聚合關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強(qiáng)的關(guān)聯(lián)關(guān)系,強(qiáng)調(diào)的是整體與部分之間的關(guān)系。
與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實(shí)例變量來實(shí)現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
聚合用帶一個(gè)空心菱形(整體的一端)的實(shí)線表示。
聚合與關(guān)聯(lián)的區(qū)別:關(guān)聯(lián)關(guān)系所涉及的兩個(gè)對(duì)象是處在同一個(gè)層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因?yàn)槿瞬皇怯勺孕熊嚱M成的。
組合是一種特殊的聚合關(guān)系,它是一種強(qiáng)類型的聚合,組合中的部分不能脫離整體而獨(dú)立存在。例如Windows的窗口和窗口上的菜單就是組合關(guān)
系。組合中的整體和部分的生命周期一致,即部分必須在組合創(chuàng)建的同時(shí)或者之后創(chuàng)建,在組合銷毀之前或者同時(shí)銷毀,部分的生命周期不會(huì)超出組合的生命周期。
組合是用帶實(shí)心菱形(整體的一端)的實(shí)線來表示。
組合與聚合的區(qū)別:
- 生命周期的實(shí)現(xiàn)上,組成需要負(fù)責(zé)其部分的創(chuàng)建和銷毀,聚合不需要
- 組合中的一個(gè)對(duì)象在同一時(shí)刻只能屬于一個(gè)組成對(duì)象,而聚合的一個(gè)部分對(duì)象可以被多個(gè)整體對(duì)象聚合,例如一個(gè)學(xué)生可以在多個(gè)學(xué)校就讀,而一個(gè)菜單在同一時(shí)刻只能是某個(gè)窗口內(nèi)的對(duì)象。