類間關(guān)系參考模板_第1頁
類間關(guān)系參考模板_第2頁
類間關(guān)系參考模板_第3頁
類間關(guān)系參考模板_第4頁
類間關(guān)系參考模板_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在建立對象模型時,很容易把依賴、關(guān)聯(lián)和聚集關(guān)系混淆。當(dāng)對象A和對象B之間存在依賴、關(guān)聯(lián)或聚集/組合關(guān)系時,對象A都有可能調(diào)用對象B的方法,這是三種關(guān)系之間的相同之處,除此之外,它們有著不同的特征。依賴關(guān)系:對于兩個相對獨立的對象,當(dāng)一個對象負(fù)責(zé)構(gòu)造另一個對象的實例,或者依賴另一個對象的服務(wù)時,這兩個對象之間主要體現(xiàn)為依賴關(guān)系。例如:機器生產(chǎn)零件,充電電池通過充電器來充電,自行車通過打氣筒來充氣,人借助螺絲刀擰螺絲,人借用船過河,藝術(shù)家鑒賞藝術(shù)品,警察抓小偷,小貓釣魚,學(xué)生讀書,某人買車。class B.class A. A:Function1(B &b) /或A:Function1(B *b)

2、 /或A:Function1(B b)/或B* A:Function1() /或B& A:Function1()/或int A:Function1() B* pb = new B; /* . */ delete pb; / Car.hclass CCar / Do something;/ Person.h#include Car.hclass CPerson void MoveFast(CCar &pCar);人的快速移動需要有車的協(xié)助, 但是這種依賴是比較弱的, 就是人也可以不用車而用其他工具, 與關(guān)聯(lián)不同的是人不必?fù)碛羞@輛車只要使用就行。單向依賴?yán)阂恢焕鲜笤谔O果園中吃蘋果,老鼠每吃一個蘋

3、果,就根據(jù)該蘋果的所含能量增加一些體重。結(jié)合上邊給出的模型,設(shè)計老鼠和蘋果類。/蘋果類:class Applepublic: Apple(int e):power(e) int Energy( ) const return power; private: int power;1 / 17;/老鼠類class Mousepublic: Mouse(int w):weight(w) int Weight( ) const return weight; void Eat(Apple * one) weight += one-Energy() * 0.5; private: int weight;擴展

4、1:class Parent;class A public: virtual A( ); void Func(Parent * p);擴展2:class Human public: virtual Human( ) virtual void Read( Book* );class Student : public Human class Robot: public Human class Book public: virtual Book( ) / .;class Novel : public Book class Cartoon: public Book 自身依賴?yán)阂粋€游戲中有很多怪物(M

5、onster),怪物之間可能要發(fā)生戰(zhàn)斗(fight),每場戰(zhàn)斗都是一個怪物與另一怪物之間的一對一戰(zhàn)斗。每個怪物都有自己的速度(Speed)、生命值(hitpoint)、攻擊力值(damage)和防御力值(defense);戰(zhàn)斗時,兩個怪物依次攻擊對方,即怪物a首先攻擊怪物b,然后輪到怪物b攻擊怪物a,之后,怪物a再次攻擊怪物b,直到一方生命值為0;戰(zhàn)斗時,由速度快的一方首先發(fā)起攻擊;若速度一樣,比較生命值,由高者首先攻擊;若生命值也相等,比較攻擊力,由高者首先攻擊;若攻擊力還相等,比較防御力,由高者首先攻擊;若四項都相等,則選擇任一方首先攻擊;怪物A攻擊怪物B時,會給怪物B造成傷害,使得怪物B

6、的生命值降低,降低值為:2*A的攻擊力-B的防御力,最小為1。請根據(jù)你對上述描述的理解,定義并實現(xiàn)怪物類Monster,成員的設(shè)計可以任意,但要求該類至少有一個成員函數(shù)fight,用來描述與另外一個怪物進(jìn)行戰(zhàn)斗的過程。不必考慮怪物的生命值減少至0后如何處理。class Monster public:Monster(int spd, int hp, int dam, int def);bool Fight(Monster& other);private:int Attacked(Monster& other) const;bool PriorTo(const Monster& other) co

7、nst;private:int speed;int hitpoint;int damage;int defense;Monster:Monster(int spd, int hit, int dam, int def) :speed(spd), hitpoint(hit), damage(dam), defense(def) bool Monster:Fight(Monster& other) if (PriorTo(other)if (Attacked(other) = 0)return true;while (true) if (other.Attacked(*this) = 0)retu

8、rn false;if (Attacked(other) = 0)return true;int Monster:Attacked(Monster& other) const int harm = damage*2-other.defense;if (harm 1)harm = 1;other.hitpoint -= harm;if (other.hitpoint other.speed;if (hitpoint != other.hitpoint)return hitpoint other.hitpoint;if (damage != other.damage)return damage o

9、ther.damage;if (defense != other.defense)return defense other.defense;return true;int main()Monster a(10,200,7,8);Monster b(10,150,8,7); /改成(10,180,8,7)則戰(zhàn)斗失敗if (a.Fight(b)coutA Win!endl;elsecoutA Lose!bfun(); 關(guān)聯(lián)關(guān)系是一種擁有的關(guān)系,可以分為單向關(guān)聯(lián),自身關(guān)聯(lián)和雙向關(guān)聯(lián)。單向關(guān)聯(lián)是指只有某一方擁有另一方的引用,這樣只有擁有對方者可以調(diào)用對方的公共屬性和方法。 如下面代碼:/ Husban

10、d.hclass CHusbandpublic: int nMoney; void GoShopping();/ Wife.h#include Husband.hclass CWifepublic: CHusband* pHuband;上面代碼中妻子擁有丈夫,可以使用對方的屬性,比如錢,可以讓對方做能做的事,比如去買東西。單向關(guān)聯(lián)例1:游戲中的英雄有各自的魅力值、聲望值、攻擊力、防御力、法力等,每個英雄可以最多帶5個寶物,每種寶物有特有提升英雄某種能力的效果。游戲中假設(shè)共有6種寶物(暫時用1,2,3,.6代表,1提升魅力2點,2提升聲望3點,3提升攻擊力1點,.),英雄這個類需要有功能:取得當(dāng)

11、前狀態(tài)下的各種能力值,在指定位置中攜帶指定寶物,丟棄指定位置中的寶物等。const int ABLITTYCOUNT =5;/5種屬性值enum ABLITY CHARM = 0,REPUTE,ATTACK,DEFENSE,POWER ;enum GOODS NONE=0,G1,G2,G3,G4,G5,G6; /6種寶物const int BAGCOUNT = 5;/5個寶物袋class Heropublic:Hero(int cha,int rep,int att,int def,int pow);void AddGood(int bagID,GOODS goods);void Remove

12、Good(int bagID);int CurAblity(ABLITY which) const return curAblitieswhich; private:void RecaculateAblities();private:/魅力值、聲望值、攻擊力、防御力、法力int rawAblitiesABLITTYCOUNT;int curAblitiesABLITTYCOUNT;/寶物袋GOODS* bagsBAGCOUNT;單向關(guān)聯(lián)例2:學(xué)生管理程序中學(xué)生和宿舍。每個學(xué)生的信息除了包括姓名、學(xué)號等之外,還要有宿舍信息。宿舍信息包括幾號樓,第幾層,幾號房間,以及住了哪幾個學(xué)生等信息。clas

13、s Studentpublic:Student(Dorm * aDorm): mpDorm(aDorm) Student() int DormFloor( ) const return mpDorm-Floor( ); / .private: Dorm * mpDorm;擴展:class Parent;class A public: virtual A( ); void Func( );protected: Parent * p;自身關(guān)聯(lián)是指擁有一個自身的引用。 如下面代碼:/ SingleMan.hclass CSingleManpublic: CSingleMan *pSingleMan;

14、雙向關(guān)聯(lián)是指雙方都擁有對方的引用,都可以調(diào)用對方的公共屬性和方法。/ Husband.hclass CWife;class CHusbandpublic: CWife* pWife;/ Wife.h#include Husband.hclass CWifepublic: CHusband* pHuband;上面代碼中丈夫和妻子是比較公平的關(guān)系,都可以使用對方公共的屬性。聚集關(guān)系:當(dāng)對象B被加入到對象A中,成為對象A的組成部分時,對象A和對象B之間為聚集關(guān)系。聚集是關(guān)聯(lián)關(guān)系的一種特例。聚集指的是整體與部分之間的關(guān)系,體現(xiàn)的是整體與部分、擁有的關(guān)系,即has-a的關(guān)系,此時整體與部分之間是可分離的

15、,可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享;例如:自行車和車把、響鈴、輪胎,汽車和引擎、輪胎、剎車裝置,電腦和主板、CPU、內(nèi)存、硬盤,航母編隊和航母、驅(qū)護(hù)艦艇、艦載機、潛艇,課題組和科研人員。class B . class A B* b; ./ Car.h#include Tyre.hclass CCarpublic: CTyre *cTyre4;/ Tyre.hclass CTyre / Do something;聚集例:學(xué)生宿舍管理程序中宿舍和學(xué)生。宿舍有多個學(xué)生,宿舍建立時,可以指定,也可不指定對應(yīng)的多個學(xué)生,并且以后可以隨時增刪學(xué)生。class Do

16、rm public: Dorm( Student * s ,int count):maxCount(count) mStudents = new Student*maxCount; for(int i=0;icount;i+) mStudentsi = si; Dorm( ) delete mStudents; void AddStudent(Student * s, int index) if ( mStudentsindex = NULL) mStudentsindex = s; void RemoveStudent(int index) mStudentsindex = NULL; pr

17、ivate:int maxCount; Student * * mStudents;擴展1:class Parent;class A public: virtual A( ); void Func( );protected: Parent * p5;例如:作業(yè)8,盒子放水果擴展2:擴展3:例:裝飾,策略例:適配器(Adapter)擴展4:擴展5:例:在制作繪圖程序時,需要繪制各種圖形元素,包括矩形、橢圓等?,F(xiàn)需要增加一種圖形元素Grid,每個Grid本身就是一個矩形,但其文本內(nèi)容一定為空,同時一個Grid還包含多個矩形,矩形個數(shù)由創(chuàng)建Grid時的參數(shù)指定,示例如圖。請定義并實現(xiàn)類Grid。Gr

18、id示例class Shape public: virtual Shape( ) virtual void Draw( )=0;Class Ellipse:public Shapepublic: virtual Ellipse ( ) virtual void Draw ( ) /*略 */ ;class Rect:public Shape public: Rect ( const char * text) /*略 */virtual Rect ( ) virtual void Draw ( ) /*略 */ ;class Grid:public Rect public:Grid (int n):Rect(NULL),count(n)prects=new Shape*count;for (int i=0; icount; i+)prectsi=new Rect(NULL);void Draw ( )for (int i=0; iDraw();Grid()for (int i=0; i聚合關(guān)聯(lián)依賴;泛化關(guān)系class B class A : public B / Animal.hclass CAnimalpublic: / implement virtual vo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論