原文地址: https://www.cnblogs.com/wolf-sun/p/3420120.html
關(guān)聯(lián)的概念
關(guān)聯(lián)用來(lái)表示兩個(gè)或多個(gè)類(lèi)的對(duì)象之間的結(jié)構(gòu)關(guān)系膜毁,它在代碼中表現(xiàn)為一個(gè)類(lèi)以屬性的形式包含對(duì)另一個(gè)類(lèi)的一個(gè)或多個(gè)對(duì)象的應(yīng)用。
程序演示:關(guān)聯(lián)關(guān)系(code/assocation)
假設(shè):一個(gè)公司只有三名員工:一個(gè)員工要么沒(méi)有工作愤钾,要么只能在一個(gè)公司工作瘟滨。(代碼簡(jiǎn)化了,主要說(shuō)明關(guān)聯(lián)關(guān)系)
Person類(lèi):
class person
{
public string name;
public person(string eName)
{
name = eName;
}
public void startWork()
{
Console.WriteLine("員工{0}開(kāi)始工作",name);
}
}
Person
Company類(lèi):
class company
{
public string name; //公司名稱(chēng)
public person[ ] employee = new person[3];
public company(string cName) //構(gòu)造函數(shù)
{
name = cName;
}
public void run()
{
Console.WriteLine("公司“{0}”開(kāi)始運(yùn)作",name);
employee[0].startWork();
employee[1].startWork();
employee[2].startWork();
}
public void stop()
{
Console.WriteLine("公司“{0}”停止運(yùn)作", name);
}
}
Company
控制臺(tái)程序:
class Program
{
static void Main(string[] args)
{
company c = new company("北京能力有限公司");
c.employee[0] = new person("張三");
c.employee[1] = new person("李四");
c.employee[2] = new person("王二");
c.run();
c.stop();
Console.Read();
}
}
Program
輸出:
對(duì)應(yīng)的類(lèi)圖:
二元關(guān)聯(lián)
概念:兩個(gè)類(lèi)之間的關(guān)聯(lián)成為二元關(guān)聯(lián)能颁。
符號(hào):
比如:在一個(gè)大公司里杂瘸,公司總裁只認(rèn)識(shí)那些核心職員,不認(rèn)識(shí)所有的普通職員劲装,而所有的職員都認(rèn)識(shí)總裁胧沫。
public class 大公司總裁
{
private 核心職員 A;
}
public class 核心職員
{
private 大公司總裁 B;
}
public class 普通職員
{
private 大公司總裁 B;
}
對(duì)應(yīng)的類(lèi)圖:
單向關(guān)聯(lián)關(guān)系對(duì)應(yīng)的代碼:
public class A
{
private B b;
}
public class B
{
}
雙向關(guān)聯(lián)關(guān)系對(duì)應(yīng)的代碼:
public class A
{
private B b;
}
public class B
{
private A a;
}
關(guān)聯(lián)的名稱(chēng)
關(guān)聯(lián)的名稱(chēng)表達(dá)了關(guān)聯(lián)的內(nèi)容,一般使用動(dòng)賓結(jié)構(gòu)的短語(yǔ)占业。(例如上面的類(lèi)圖中:work)
關(guān)聯(lián)命名的原則是該命名是否有助于理解該模型绒怨。
關(guān)聯(lián)的角色
關(guān)聯(lián)中的角色是類(lèi)的對(duì)象在關(guān)聯(lián)中所扮演的角色。例如上圖中的:employer(雇傭方)谦疾,employee(員工:受雇傭的人)南蹂。關(guān)聯(lián)的角色會(huì)轉(zhuǎn)換為代碼。
class company
{
public string name; //公司名稱(chēng)
public person[ ] employee = new person[3];
public company(string cName) //構(gòu)造函數(shù)
{
name = cName;
}
……
}
關(guān)聯(lián)的可見(jiàn)性
用可見(jiàn)性修飾角色名稱(chēng)念恍,以說(shuō)明角色名稱(chēng)可以在哪些范圍內(nèi)可被訪問(wèn)到六剥。
代碼:
class company
{
public string name; //公司名稱(chēng)
// "+"
public person[] employee = new person[3];
public company(string cName) //構(gòu)造函數(shù)
{
name = cName;
}
……
}
關(guān)聯(lián)的多重性
多重性是指有多少個(gè)對(duì)象參與了關(guān)聯(lián)。具體的說(shuō)峰伙,是指類(lèi)A的一個(gè)對(duì)象對(duì)應(yīng)類(lèi)B的對(duì)象的個(gè)數(shù)疗疟。
舉個(gè)例子說(shuō)明吧:
對(duì)應(yīng)代碼:
public class 狗
{
private 腿[] X = new 腿[4];
}
public class 腿
{
……
}
(就是上面的數(shù)字描述)
多重性有哪些表示?
1: 表示1個(gè)
0..: 表示任意多個(gè)( ≥0)(可以換成n)
: 表示任意多個(gè)( ≥0)
1..: 表示1個(gè)或多個(gè)(≥1)
0..1: 表示0個(gè)或1個(gè)
5..11: 表示5-11個(gè)
1瞳氓,3策彤,8: 表示個(gè)1或3個(gè)或8個(gè)
0,3..8: 表示0個(gè)或3-8個(gè)
聚合與組合
聚合(聚集)與組合(合成匣摘、組成)是兩種特殊的關(guān)聯(lián)店诗。
1、聚合(關(guān)聯(lián)的特例)
聚合的概念:聚合表示類(lèi)之間的整體與部分的關(guān)系音榜。聚合意味著一個(gè)類(lèi)擁有但共享另一個(gè)類(lèi)的對(duì)象庞瘸。
程序演示:聚合(code/associationB)
class cpu
{
public string name; //品牌
public string rate; //主頻
public cpu(string cpuName,string cpuRate)
{
name = cpuName;
rate = cpuRate;
}
}
class computer
{
public string buyTime;
public string color;
public cpu mycpu;
public computer(string computerBuyTime,string computerColor)
{
buyTime = computerBuyTime;
color = computerColor;
}
public void cpuInfo()
{
Console.WriteLine("該電腦的CPU品牌為:{0}",mycpu.name);
Console.WriteLine("該電腦的CPU主頻為:{0}", mycpu.rate);
}
}
class Program
{
static void Main(string[ ] args)
{
cpu cpuA = new cpu("Intel","2.93");
cpu cpuB = new cpu("AMD","2.61");
computer computerC = new computer("2008-9-1","黑色");
Console.WriteLine("購(gòu)買(mǎi)時(shí)間為:{0}", computerC.buyTime);
Console.WriteLine("顏色為:{0}\n", computerC.color);
Console.WriteLine("現(xiàn)在安裝第一塊CPU");
computerC.mycpu = cpuA; //將cpuA裝入該電腦中
computerC.cpuInfo();
Console.WriteLine("\n現(xiàn)在安裝第二塊CPU");
computerC.mycpu = cpuB; //將cpuA裝入該電腦中
computerC.cpuInfo();
}
}
聚合的符號(hào)
在整體類(lèi)端加空心菱形。
關(guān)聯(lián)關(guān)系和聚合關(guān)系在語(yǔ)法上是沒(méi)辦法區(qū)分的瞬场,得從語(yǔ)義上才能更好的區(qū)分兩者的區(qū)別葛家。
2、組成
組成的概念:組成是一種特殊形式的聚合泌类。
與聚合相比,它有兩個(gè)特點(diǎn):
一個(gè)部分類(lèi)最多只能屬于一個(gè)整體類(lèi)
最容易理解的一個(gè)例子就是窗體和文本框,當(dāng)窗體不存在時(shí)双仍,文本框也將不存在枢希。
組成的符號(hào):
在整體類(lèi)端加實(shí)心菱形。如圖:
聚合與組成的區(qū)別
關(guān)聯(lián)與聚合(包括組合)的區(qū)別
關(guān)聯(lián)關(guān)系所涉及的兩個(gè)類(lèi)是處于同一個(gè)層次上的朱沃。比如學(xué)生和課程就是一種關(guān)聯(lián)關(guān)系苞轿,而不是聚合關(guān)系,因?yàn)閷W(xué)生不是有課程組成的逗物。
聚合關(guān)系涉及的兩個(gè)類(lèi)處于不平等的層次上搬卒,一個(gè)代表整體,一個(gè)代表部分翎卓。比如電腦和顯示器契邀、鍵盤(pán)、主板失暴、內(nèi)存就是聚合關(guān)系坯门,因?yàn)橹靼迨请娔X的組成部分。而鍵盤(pán)等部件不會(huì)因?yàn)殡娔X沒(méi)了逗扒,就不存在了古戴。
聚合與組合的區(qū)別:
組合:整體類(lèi)端的重?cái)?shù)必須是1,部分類(lèi)的重?cái)?shù)是任意的矩肩。
聚合:整體類(lèi)端的重?cái)?shù)可以大于1现恼,部分類(lèi)的重?cái)?shù)是任意的备韧。