“你好,阿米戈!今天,我会为你打开一个奇妙的新世界。那就是面向对象的编程 (OOP)。你已经知道什么是类,什么是对象。今天,我们会进一步学习这两个概念以及其他相关内容。”

首先,我们来看一下 OOP 的四大支柱。它们分别是抽象、封装、继承和多态。(过去,只有三大支柱,抽象是后加的)

1) 抽象。

现实生活中,最能体现抽象这个概念的当属公司的职位简介。职称是一码事,它所对应的职责又完全是另外一码事。

假如,你正在为你未来的公司编写组织架构图。你可能会把秘书的职责进行细分,划归到多个其他岗位里。你可能会把 CEO 的工作拆分成几个独立的岗位:首席财务官、首席技术官、首席市场营销官、首席人力资源官。又或者,你可以把办公室经理和招聘专员这两个岗位合并成一个。

假如,你拟定好了公司各岗位的名称,之后,你就会为这些岗位“分配”好对应的职责。这就是抽象:把庞大的东西拆分成多个细小的部分。

OOP:基本原理 - 1

就程序员而言,抽象就是把一个程序妥善地分成多个对象。

一个大程序通常是多个对象通过各种各样的方法进行交互。通过抽象,你可以选出一个对象的主要特性,忽视其他不重要的信息。

抽象就好比军事战略。如果你的战略选错了,任何巧妙的战术都无力回天。

2) 封装。

封装主要是通过简化对象来提高对象之间的交互。

OOP:基本原理 - 2

简化,最好的办法就是隐藏掉那些别人不需要知道的复杂信息。例如,如果你坐在波音飞机驾驶控制台前,你要花很长时间去弄懂它们的运作原理:

OOP:基本原理 - 3

但若换做是飞机上的乘客,一切就将变得简单多了:他们买票,然后登机、起飞、到达目的地。你可以轻松地从一个大陆飞往另一个大陆,只要知道怎怎么“买票”,怎么“登机”就行。我们看不到整个过程有多复杂:从起飞前的相关准备工作,到起飞、着陆以及各种潜在紧急情况。更不要说卫星导航、自动驾驶和空中交通管制中心了。这让我们的生活变得简单。

从程序设计角度来说,封装就是“把实现隐藏起来”。我很喜欢这个解释。我们的类包含成百上千个方法,在不同的情境里实现高度复杂的行为。但是,我们可以把这些方法全部隐藏起来(标为 private 即可),只留 2 到 3 个方法用于与其他类进行交互(标为 public 即可)。之后,我们程序里的所有其他类都只能看到(和调用)这类里为数不多的几个方法。类的复杂性都被藏起来了,就像飞机上快乐的旅客都看不到驾驶舱一样。

3) 继承。

编程和现实生活里都有继承这个概念。在编程里,继承是指两个类之间的一种特殊关系。但现实生活里,继承所指的就有趣得多了。

现实生活里,我们若要创造一个东西,有两种办法:

1) 从零开始,投入大量时间和精力去创造。

2) 利用现有的,去制造我们想要的。

最好的办法是:我们利用现有的好解决方案,改造或微调使其符合我们的需求,最后投入使用。

想想人类的进化。如果我们把人类的起源一直追溯到地球上的生命起源,我们会发现这中间有数十亿年那么漫长。但如果我们把猴类作为人类的起源,那这中间就只有几百万年那么长。从零开始,需要很长很长一段时间才能创造新物种。非常漫长。

与此类似,在编程里,我们可以在一个类的基础上来创造出一个新类。新类就会成为现有类的子类(继承人)。如果有一个类,你想要的 80-90% 的数据和方法都在里面,这时,继承就会非常有用。我们只要简单地声明某个适用的类是新类的父类即可。父类所有的数据和方法就自动成为新类的一部分。非常方便,对吗?

4) 多态。

多态是一个编程概念,它是指同一个接口里不同实现被隐藏起来的情况。若是要在现实生活中找个例子的话,不妨来看看开车这个动作。

如果一个人会开卡车,那他或她十之八九也会开救护车或者跑车。一个人会开车,就不会拘泥于开的是哪种车,因为它们有相同的控制接口:方向盘、脚踏和变速杆。汽车虽然内部构造不同,但控制接口是相同的。

回到编程,多态让我们能够与不同类的对象进行交互(这些类有同一个父类),且交互方法不变。多态的重要性不容小觑。程序越大,多态就越重要。

OOP 是基本原理,编程是规则。它们都在通过某种方式规范着我们,但同时在程序逐渐变大的过程中,给我们带来巨大优势OOP 的四大基本原理就像是一张椅子的四条腿。随便拿走其中的任何一个,整个系统都会变得不稳定。