面向对象是我们编程当中必学的一课,也是软件工程当中非常非常重要的一环。
当我们初学编程的时候,完成的往往都是面向过程的程序。比如说计算圆的面积,或者是做一道 LeetCode 算法题。我们编写的所有代码完成的都是单纯的计算步骤,而面向对象是一次对计算步骤的抽象,它并不是一种技术,而是一种思维模式和编程理念。
我们以微信当年的打飞机游戏为例。
假设我们要来开发这样一个游戏,如果我们以面向过程的思路去编程。那么我们需要用许多变量来表示敌机、己方飞机等等。对于一架飞机来说,它会有许多属性,比如说血量、弹药、位置等等。那么就意味着我们需要使用许多数组来分别存储这些变量。
显然,这种方式的代码编写难度很大,因为变量很多,逻辑也很乱,很容易写着写着就晕了。
所以我们可以对问题进行一次抽象,可以简单理解成,将一些变量聚合成一个实体,针对每一个实体开发功能。比如说我们可以把飞机看成是一个实体,在这个实体当中赋予属性。比如说血量、位置、攻击力等等。在面向对象当中我们把这样的实体叫做类,其实可以简单理解成是一种特殊的结构体。
class Plane {
int x, y; // 位置
int health; // 血量
int attack; // 攻击力
bool alive; // 是否存活
};
这就是一个最简单的类,除了把struct
换成了class
,几乎和结构体是一样的。按照同样的方法, 我们可以定义出其他的一些类,甚至整个游戏显示的界面也可以抽象成一个类。
到目前为止,看起来我们只是定义了一个结构体。实际上不止如此,我们可以给每一个类实现一些函数,丰富它的功能。
比如说,飞机受到攻击就会扣血,我们可以添加一个受到攻击之后的处理函数,再比如飞机移动坐标会发生变化。再比如飞机还可以发动攻击,朝着某个方向开炮……
所以这个类会变成这样:
class Plane {
int x, y; // 位置
int health; // 血量
int attack; // 攻击力
bool alive; // 是否存活
void move() {
// todo
}
void beAttack(int att) {
// todo
}
void attack() {
// todo
}
};
也就是说我们围绕这个实体,把所有相关的功能都聚合到了一起。当我们把功能当中所有的实体都抽象完成之后,那么一系列复杂的运算逻辑,就可以抽象成实体之间的一系列交互。这样不仅代码更加简洁,可读性也更高。
如果是初次接触面向对象的话,会觉得有些困惑是正常的。但这毕竟不是一个很复杂的思想,随着代码量的增加,很快就能熟悉起来,也就不会觉得困惑了。