C++编程杂谈之三:面向对象(续)

开封hanjun

开封hanjun

2016-01-29 12:19

C++编程杂谈之三:面向对象(续),C++编程杂谈之三:面向对象(续)

C++编程杂谈之三:面向对象(续)

作者:xulion

下载例子源代码

 

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)     上一篇我们涉及了面向对象的一个基本概念--封装,封装是一个相对比较简单的概念,也很容易接受,但是很多的场合下面,仅仅是封装并不能很好的解决很多问题,考虑下面的例子:
假设我们需要设计一个对战游戏的战斗细节,在最初的版本中我们将支持一种动作--fight。假设我们有三种角色:fighter、knight和warrior,每种角色的health、hit point不同,基于封装的基本想法,我们很自然的想到对每个对象使用类的封装,首先明显的元素有2个:health、hit point,另外还有name(我们不能只有三个角色)和战斗的速度speed,方法有:hit、isalive。基于这样的想法,我们给出下面的类:
 
 class fighter{private:int               m_iHealth;int              m_iSpeed;//为了方便,这个值使用延时值,越大表示速度越慢const int          m_iHitPoint;char             m_strName[260];public:fighter(const char* strName);void hit(fighter* pfighter);bool isAlive(); };    
    上面的类可以清楚的抽象出我们所需要表达的数据类型之一,这里也许你已经发现了一些问题:
成员函数hit用来处理战斗事件,但是我们有不同的角色,fighter不可能只跟自己同样的对手作战,我们希望它能和任何角色战斗,当然,使用模板函数可以简单的解决这个问题。另外,我们必须去实现三个不同的类,并且这些类必须都实现这些属性和方法。即使这些问题我们都解决了,现在我们要组织两个队伍作战,我们希望使用一种群体类型来描述它们,问题是我们必须针对每一种类建立相应的群体结构,当然你可以认为3个不同的类型不是很多,完全可以应付,那么如果有一天系统升级,你需要管理上百种类型的时候,会不会头大呢?
    在C++中,继承就可以很好的解决这个问题,在C++中,继承表示的是一种IS-A关系,即派生类IS-A基类,很多现实世界中的关系可以这样来描述,如:dog is-a animal,dog是animal的派生(继承),继承产生的对象拥有父(基)对象的所有属性和行为,如animal的所有属性和行为在dog身上都会有相应的表现。在UML的描述中,这种关系被称为泛化(generalization)。一般情况下,当我们需要实现一系列相似(具有一定的共性)然而有彼此不同的类别的时候,使用继承都是很好的解决办法,例如前面的代码虽然也能够实现我们的目标,但是显然很难管理,下面给出使用继承后的实现:
 class actor//基类{protected:int               m_iHealth;const int         m_iSpeed;//为了方便,这个值使用延时值,越大表示速度越慢const int         m_iHitPoint;char              m_strName[260];public:actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint);int& Health(){ return m_iHealth; };const char* getName(){ return m_strName; };virtual void hit(actor *Actor) = 0;bool isAlive(); };  actor::actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint):m_iHealth(iHealth),m_iSpeed(iSpeed),m_iHitPoint(iHitpoint){strcpy(m_strName,strName);}bool actor::isAlive(){return (m_iHealth>0);}///////////////////////////////////////////////////////////类fighterclass fighter :public actor{public:fighter(const char* strName);virtual void hit(actor *Actor);private:};fighter::fighter(const char* strName):actor(strName,100,20,20){}void fighter::hit(actor *Actor){Sleep(m_iSpeed);if(!isAlive()){return ;}if(Actor&&Actor->isAlive()){ //这里我们用一个函数做了左值,因为函数返回的是引用if(isAlive())Actor->Health() = Actor->Health() - m_iHitPoint;}}///////////////////////////////////////////////////////////类knightclass knight :public actor{public:knight(const char* strName);virtual void hit(actor *Actor);private:};knight::knight(const char* strName):actor(strName,150,20,25){}void knight::hit(actor *Actor){Sleep(m_iSpeed);if(!isAlive()){return ;}if(Actor&&Actor->isAlive()){if(isAlive())Actor->Health() = Actor->Health() - m_iHitPoint;}}///////////////////////////////////////////////////////////类warriorclass warrio      
展开更多 50%)
分享

猜你喜欢

C++编程杂谈之三:面向对象(续)

C语言教程 C语言函数
C++编程杂谈之三:面向对象(续)

C++编程杂谈之二:面向对象

C语言教程 C语言函数
C++编程杂谈之二:面向对象

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C++面向对象编程入门:类(class)

编程语言 网络编程
C++面向对象编程入门:类(class)

类——C++面向对象编程的基石

编程语言 网络编程
类——C++面向对象编程的基石

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

c++面向对象的编程入门篇-----类(class)

编程语言 网络编程
c++面向对象的编程入门篇-----类(class)

C/C++编程新手错误语录(续二)

编程语言 网络编程
C/C++编程新手错误语录(续二)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JSP开发入门(一)--安装好你的机器来使用JSP

JSP开发入门(一)--安装好你的机器来使用JSP

《忍者必须死2》角色系统全解析

《忍者必须死2》角色系统全解析
下拉加载更多内容 ↓