3.1 面向对象基本概念
对象(比较严谨的说法是类)是在我们心理活动中抽象化后的产物。我们在解读“对象是真实世界个体的抽象对象”时要小心。以飞机为例,从资产管理系统的角度来说,飞机是“活动资产”,而从进销存系统来说,飞机可能只是Item(产品)类中的一个属性(产品名称),可能只有在被视为交通工具时,飞机才会化身(被抽象化)为“飞机”类。结论是,真实世界中的个体,在不同的问题领域(需求)中,可能被抽象化(化身)为不同的对象(或者仅仅归属于某类的属性)。真实世界中的“名词”,不见得适合拿来当做对象——对象需要根据需求(问题领域)分析(可能还需要发挥一些想象力)而来,而非从直觉而来。
抽象化是人人具有的本能,然而境界的提升则有赖于进一步的修炼。分析模式/设计模式可以成为我们有力的助手,活化我们的面向对象思想,以便找出确切的对象,让系统具备“应变”(可读性、可维护性、可扩展性)的能力。
我们再来看看面向对象的3把权杖,分别如下。
封装(Encapsulation):将变动局限在一个小范围内的做法。封装是通往面向对象的 入口。
继承(Inheritance):继承可以让父代衍生出子代,为多态做准备。本书不强调重用性(Reuse),因为继承不是重用的唯一方式。一会我们将介绍委托(Delegate)的方式。
多态(Polymorphism):让我们可以“一视同仁”地看到后续衍生出的新类,以便系统的扩充及应变。
这是一般教材都会提到的面向对象的根本。而根据笔者过去从事Design Pattern课程的教学经验,如果一开始就用“无招胜有招”的境界来引导初学的学生,可能会过于虚无缥缈,但也不至于将23个GoF Pattern视为23个硬邦邦的公式,而是习惯使用继承和委托这两个手法来引导学生看待、拆解这些Pattern,并贯穿整个OO思想的培养过程。接下来,我们就来看看什么是委托和继承。