ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:83.17KB ,
资源ID:11558364      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11558364.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(类间关系.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

类间关系.docx

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