什么是面向对象?
首先是我在百度上找到得比较官方得描述,接下来就以一个故事来详细得阐述一下面向对象。
面向 对象 (Object Oriented)是 软件开发方法 ,一种编程范式。 面向 对象 的概念和应用已超越了 程序设计 和软件开发,扩展到如 数据库系统 、交互式界面、应用结构、应用平台、 分布式系统 、 网络管理 结构、CAD技术、 人工智能 等领域。 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的, 面向对象方法 ,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式
假如我们现在是一个对战类游戏得开发者,现在需要你开发一个敌人的代码。这个敌人有以下特征
敌人会在指定区域内巡逻,如果有玩家闯进该区域就会去追玩家,追的过程中进入到攻击范围就会攻击玩家。
如果用代码实现就是
if 玩家进入巡逻区域:
追逐玩家
if 进入到攻击范围:
攻击玩家
现在如果加入一个需求,敌人在攻击玩家的时候如果血量过低,或者在发现玩家的时候血量过低就不会去追逐玩家而是逃跑
那代码书写如下
if 玩家进入巡逻区域:
if 血量过低:
逃跑
追逐玩家
if 进入到攻击范围:
if 血量过低:
逃跑
攻击玩家
现在如果继续让你增加一些需求,并且大量的去产生各种不同的敌人的时候,如果还是一个一个的去if 判断就会很繁琐。那么如何才能高效的产生大量的敌人呢?我们这个时候可以吧敌人的状态和行为提取出来封装到一个类里边如下
class condition:
def 判断血量(参数):
return 血量
def 判断巡逻(参数):
if 玩家进入巡逻区:
return true
else:
return false
def 判断是否进入攻击区域(参数):
if 玩家进入攻击范围:
return true
else:
return false
class behavior(condition):
def 攻击(参数):
if self.判断是否进入攻击范围:
self.逃跑(参数)
玩家血量降低等操作
else:
接近玩家代码
def 逃跑(参数):
if 判断血量(参数)< 20:
远离玩家
def 追逐(参数,敌人类型):
if 判断巡逻(参数):
if 敌人类型 == 普通:
self.逃跑(参数)
self.攻击(参数)
elif 敌人类型 == 死士:
self.攻击(参数)
def 巡逻(参数,敌人类型):
巡逻代码
self.追逐(参数,敌人类型)
class 敌人类型1(behavior,condition):
def __init__(self,血量):
self.血量 = 血量
self.类型 = 类型
敌人1 = 敌人类型1(100)
敌人2 = 敌人类型1(100)
敌人1.巡逻(区域,普通)
敌人2.巡逻(区域,死士)
其中把可能会用到的状态和行为提取出来写成两个类,这个过程就叫做封装。
这个时候如果在需要给某个状态做出不同的反应就可以通过修改对应类中的方法来实现,再也不用一个一个角色去修改。大大提高了代码的复用性和可维护性。对于提取和封装的过程也就是面向对象的过程
面向对象的三大特征
1. 封装
对于上边把可能会重复利用的代码提取出来放到一个类的过程就叫封装
2. 继承
对于上边角色想要在某个条件执行某个行为的时候,可以通过继承的方法来调用对应类中的方法
3. 多态
对于行为类中有很多应为状态,但是在敌人1(血量低会逃跑)和敌人2(会一直攻击玩家)表现出不同的状态就叫做多态
面向对象的优势在哪里?
1,维护性强,比如现在有一百个敌人需要在血量低于50就逃跑,那么就只需要在判断血量的代码中修改即可
2,扩展性强,如果现在需要给100个敌人添加呼叫队友功能则只需要在行为类中添加对应方法就可以