我们编写程序的目的是为了解决现实世界中遇到的问题。在我们受到的教育中,解决问题的一种途径是分而治之,将复杂的问题分解为可以解决的小问题,对应到软件开发中,我们习惯将其称为分模块。不过,在不同人的眼里,模块却是不同的,所以,我们对模块有了不同的叫法:子系统、组件、函数……。OO也是一种划分方法,只不过在这里,我们用了“对象(Object)”。
划分模块的一种原则是,高内聚低耦合。高内聚的意思就是把逻辑上可以归在一起的东西放在一起。我们知道一个著名的公式“算法+数据结构=程序”,OO就为我们提供了一种方式,将相关的算法(成员函数、方法……)和数据结构(成员变量、字段……)封装到一起,这就是我们常见的类的概念,同时,也体现出OO的第一个特点封装。关于封装,我们知道有一个常见方法是,将数据设为私有。因为一旦这个类发布出去,为了保证用到这个类的程序能够正常运行,我们必须在随后的日子里保证这个程序行为和从前一模一样,这是我们对人负责的表现。如果数据成员暴露出去,那无疑于家丑外扬,因为我们不知道别人会对它们做些什么。以后想在里面做一些手脚,可就难上加难了,反之,至少我们还有函数这层保护伞。
当我们编写的类多了起来,很有可能出现的一种情况是,一些类之间出现了许多相似之处,比如狗类和猫类都要睡觉,都要叫喊,懒惰的程序员不会允许自己反复编写重复的代码,于是,一种减少重复的方法应运而生,这就是基类(超类、父类……)。把公共的部分放到基类中,然后,只要我们只要声明自己和这个基类的关系,我们就同样拥有了这些公共的部分,这便是OO的第二个特点——继承。继承的出现给了我们一个组织相关类之间关系的方法,如果我们把基类视为一棵树的根,那么这个树的分支便是一个个子类,就这样子子孙孙,一棵枝繁叶茂的大树就此形成,于是有了一种说法,叫类的层次体系(hierarchy)。或许,与通常的树最大的差异在于,这棵树的根长在了上面,所以,如果把一个类向它的基类进行转换的时候,我们称之为向上转型,反之为向下转型。
拥有了封装和继承,我们便可以称自己是基于对象(Object Based)了,没错,还不是面向对象,因为这里还缺少面向对象的第三个特点——多态。前面提到继承的时候,我们考虑的更多的相同之处,而多态则给了我们一个考虑差异的机会。继承为多态提供了一个表演的舞台,因为只有在相同的接口上展现出不同,才可以称之为差异,相同的接口正是由继承为我们带来的。我们前面说过,继承给了我们一个把相同的东西放在一起的机会,而多态则给了我们用相同展现不同的机会,于是,这个世界丰富多彩起来。因为在我们只要针对基类的接口进行编程,而无需顾及具体的子类,只要是在这个类体系中的子类,完全可以毫无障碍与我们的代码进行交互。这就给我们提供了一个机会,我们的代码可以与编写时尚未问世的代码进行合作,为未来的扩展奠定了基础。
谈及继承的时候,我们更多想到的是一个类从它的基类上获得了什么,考虑得更多的是子类,以层次关系来看,这是一种从下向上看的观点。与此相反,谈及多态的时候,我们更多的是从基类的角度来考虑问题,而忽略了其子类之间的差异,所以,这是一种从上向下看的观点。
转自:dreamhead