1、类间关系在建立对象模型时,很容易把依赖、关联和聚集关系混淆。当对象A和对象B之间存在依赖、关联或聚集/组合关系时,对象A都有可能调用对象B的方法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。依赖关系:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。例如:机器生产零件,充电电池通过充电器来充电,自行车通过打气筒来充气,人借助螺丝刀拧螺丝,人借用船过河,艺术家鉴赏艺术品,警察抓小偷,小猫钓鱼,学生读书,某人买车。class B.class A. A:Function1(B &b) /或A:Function1(B
2、 *b) /或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);人的快速移动需要有车的协助, 但是这种依赖是比较弱的, 就是人也可以不用车而用其他工具, 与关联不同的是人不必拥有这辆车只要使用就行。单向依赖例:一只老鼠在苹果园中吃苹果,老鼠每
3、吃一个苹果,就根据该苹果的所含能量增加一些体重。结合上边给出的模型,设计老鼠和苹果类。/苹果类:class Applepublic: Apple(int e):power(e) int Energy( ) const return power; private: int power;/老鼠类class Mousepublic: Mouse(int w):weight(w) int Weight( ) const return weight; void Eat(Apple * one) weight += one-Energy() * 0.5; private: int weight;扩展1:c
4、lass 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 自身依赖例:一个游戏中有很多怪物(Mons
5、ter),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。每个怪物都有自己的速度(Speed)、生命值(hitpoint)、攻击力值(damage)和防御力值(defense);战斗时,两个怪物依次攻击对方,即怪物a首先攻击怪物b,然后轮到怪物b攻击怪物a,之后,怪物a再次攻击怪物b,直到一方生命值为0;战斗时,由速度快的一方首先发起攻击;若速度一样,比较生命值,由高者首先攻击;若生命值也相等,比较攻击力,由高者首先攻击;若攻击力还相等,比较防御力,由高者首先攻击;若四项都相等,则选择任一方首先攻击;怪物A攻击怪物B时,会给怪物B造成伤害,使得怪物B的生命
6、值降低,降低值为:2*A的攻击力-B的防御力,最小为1。请根据你对上述描述的理解,定义并实现怪物类Monster,成员的设计可以任意,但要求该类至少有一个成员函数fight,用来描述与另外一个怪物进行战斗的过程。不必考虑怪物的生命值减少至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) c
7、onst;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)
8、 = 0) return 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.da
9、mage) return damage other.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)则战斗失败 if (a.Fight(b) coutA Win!endl; else coutA Lose!bfun(); 关联关系是一种拥有的关系,可以分为单向关联,自身关联和双向关联。单向关联是指只有某一方拥有另一方的引用,这样只有拥有对方者
10、可以调用对方的公共属性和方法。 如下面代码:/ Husband.hclass CHusbandpublic: int nMoney; void GoShopping();/ Wife.h#include Husband.hclass CWifepublic: CHusband* pHuband;上面代码中妻子拥有丈夫,可以使用对方的属性,比如钱,可以让对方做能做的事,比如去买东西。单向关联例1:游戏中的英雄有各自的魅力值、声望值、攻击力、防御力、法力等,每个英雄可以最多带5个宝物,每种宝物有特有提升英雄某种能力的效果。游戏中假设共有6种宝物(暂时用1,2,3,.6代表,1提升魅力2点,2提升声
11、望3点,3提升攻击力1点,.),英雄这个类需要有功能:取得当前状态下的各种能力值,在指定位置中携带指定宝物,丢弃指定位置中的宝物等。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(
12、int bagID,GOODS goods); void RemoveGood(int bagID); int CurAblity(ABLITY which) const return curAblitieswhich; private: void RecaculateAblities();private: /魅力值、声望值、攻击力、防御力、法力 int rawAblitiesABLITTYCOUNT; int curAblitiesABLITTYCOUNT; /宝物袋 GOODS* bagsBAGCOUNT;单向关联例2:学生管理程序中学生和宿舍。每个学生的信息除了包括姓名、学号等之外,还要
13、有宿舍信息。宿舍信息包括几号楼,第几层,几号房间,以及住了哪几个学生等信息。class 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;自身关联是指拥有一个自身的引用。 如下面代码:/ SingleMan.hclass
14、 CSingleManpublic: CSingleMan *pSingleMan;双向关联是指双方都拥有对方的引用,都可以调用对方的公共属性和方法。/ Husband.hclass CWife;class CHusbandpublic: CWife* pWife;/ Wife.h#include Husband.hclass CWifepublic: CHusband* pHuband;上面代码中丈夫和妻子是比较公平的关系,都可以使用对方公共的属性。聚集关系:当对象B被加入到对象A中,成为对象A的组成部分时,对象A和对象B之间为聚集关系。聚集是关联关系的一种特例。聚集指的是整体与部分之间的关
15、系,体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;例如:自行车和车把、响铃、轮胎,汽车和引擎、轮胎、刹车装置,电脑和主板、CPU、内存、硬盘,航母编队和航母、驱护舰艇、舰载机、潜艇,课题组和科研人员。class B . class A B* b; ./ Car.h#include Tyre.hclass CCarpublic: CTyre *cTyre4;/ Tyre.hclass CTyre / Do something;聚集例:学生宿舍管理程序中宿舍和学生。宿舍有多个学生,宿舍建
16、立时,可以指定,也可不指定对应的多个学生,并且以后可以随时增删学生。class Dorm 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 RemoveSt
17、udent(int index) mStudentsindex = NULL; private:int maxCount; Student * * mStudents;扩展1:class Parent;class A public: virtual A( ); void Func( );protected: Parent * p5;例如:作业8,盒子放水果扩展2:扩展3:例:装饰,策略例:适配器(Adapter)扩展4:扩展5:例:在制作绘图程序时,需要绘制各种图形元素,包括矩形、椭圆等。现需要增加一种图形元素Grid,每个Grid本身就是一个矩形,但其文本内容一定为空,同时一个Grid还包含
18、多个矩形,矩形个数由创建Grid时的参数指定,示例如图。请定义并实现类Grid。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
19、 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聚合关联依赖;泛化关系class B class A : public B / Animal.hclass CAnimalpublic: / implement virtual void EatSomething() / Do something ;/ Tiger.h#include Animal.hclass CTiger : public CAnimal / Do something;实现关系泛化和实现的区别就在于子类是否继承了父类的实现,如有继承则关系为泛化,反之为实现./ Animal.hclass CAnimalpublic: / interface virtual void EatSomething() = 0;/ Tiger.h#include Animal.hclass CTiger : public CAnimal / Do something;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1