对于类和方法,我们已经有了一个初步的认识。而假如你听说过面向对象,很大可能会听说过面向对象的三大特性。如果你没听说过,那么你现在听说了。
1继承
我们再类的里面已经提到过继承,但是重点是什么是继承。而在三大特性角度来看,我们更要讨论如何继承。
出于这个目的,一方面我们应该把更多通用的内容交给父类,并且让父类尽可能多的适应大部分状况,另外一方面我们不应该让一个基本的类失去他的公正性,我们可以让代码向更常用的方向倾斜,但是应该对少数但是必要的子类给以足够的支持。
继承另外的一个很重要问题,子类之间应该在交互上有一定的相似性,用我们一直在举的例子,笔。随着科技的发展,最早从铅笔,到现在的中性笔、太空笔,虽然外观和技术有显著的更新,但是作为交互的方式,大体上都没有变。
也因此,我们在设计类和子类的同时,应该考虑到实际使用时,对于笔、上墨器、人手等等与笔的交互,是否相似。对于我个人的意见,这种通用性的经验,应该交给父类来进行,并把其中更加自由的部分作为额外的函数交给子类来独特的定义,最大的保证使用时不会给其他物体带来不便。
2封装
我们知道,任何一个类里面有种种属性,玩家有血量,笔有墨量。
在面向对象的编程里面,我们更希望让自己的属性受到自己的控制。就像你的钱,你更希望自己亲手交给别人,而不是放在桌子上让别人自由的拿对吧?
封装这一特性就在于,让类自己的属性,更多的由自己来控制。基本的表现就是大量的setter和getter,我不是很清楚这两个词要怎么准确的翻译。对于外部所需要的改变,玩家损失了血量,在这种思想下,这个血量不应该由世界或者其他的什么大的方面改变,而是要在玩家类内设置修改自己血量的方法。
那么好处呢?很简单的一点,假如我们在游戏中加入损失血量触发的特效或者物品,我们就不需要游离于各种各样的代码之间寻找当初损失血量时的种种操作,而对于更多的问题,这种修改可能遍布整个代码当中。这很恐怖对吧?而当我们完成了封装,我们只需要加入玩家或者他们的父类里,血量的setter进行相应的修改就可以了。这对一个简单的游戏没什么,但是对于复杂或者开发周期很长的游戏,封装是一种很重要的思想。
3多态
说到多态,就是耦合性,但是这两个词没有之前的内容显而易见。
但是多态的概念本身已经在前文略加描述过,而这段,会在之前的基础上进一步用使用的角度来展示。
在以前,计算机使用各种各样的接口,打印机、串口、PS2,但是现在呢?我们看到他们大部分被USB取代了,这基本上就是耦合性的概念。
耦合性意味着对于现有的代码,我们在开发新功能,加入新模块的同时,对于原有代码的改动有多大。而耦合性高的代码,就像一件定制的西装一样的昂贵,对其进行改变就会付更多的代价。
于是就有了多态,与现实相似在编程的时候我们也希望有类似USB这种通用性很高的接口,而接口本身也是一种编程概念,但这个概念我们现在不讨论。
我们希望有这样一种让我们面对大部分,理想上是所有的情况,都能使用更通用的方法。比如笔可以在纸上写字,那对于写字的人来说,更多的希望对所有笔都有相似的交互方式,这在实际编程时就变成了,对于一些子类,我们希望他们的父类提供一个更统一的方法来让我们使用,而需要父类可以掌握并找到子类的函数。同时希望我们为父类编写的代码同样适用于他的子类。
如之前所讲,这个概念在前面已经提过,在游戏中编程,我们会看到许多初始化完成,或是逻辑帧处理,或是绘图帧处理。当游戏进程中,会自发的调用这些逻辑或者绘图帧,而我们要做的和这些类似,让我们更大一层次的代码,使用更通用的方法调用,并把决定细节交给内部。C++为我们提供了虚函数,C我们可以直接使用函数指针,而更新兴的语言会更直接的提供这种方法。
系列文章
面向对象的程序设计在游戏开发中使用(一):类
面向对象的程序设计在游戏开发中使用(二):方法
面向对象的程序设计在游戏开发中使用(三):三大特性
面向对象的程序设计在游戏开发中使用(四):五大原则
面向对象的程序设计在游戏开发中使用(五):基本计算器
面向对象的程序设计在游戏开发中使用(六):数与抽象数
面向对象的程序设计在游戏开发中使用(七):享受劳动果实
作者:Kingfeng
来源:奶牛关
原地址:https://cowlevel.net/article/2051328