理解面向对象编程,首先理解面向对象的三要素:封装、继承、多态。
封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口
有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者;而外部调用者也可以知道自己不可以碰哪里。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。
继承和多态不能割裂,继承具有两种含义,一是继承基类的方法并作出改变或扩展,解决了代码重用问题,二是声明某个子类兼容于某基类,接口上兼容于基类,外部调用者可无需关注其差别,内部机制会自动把请求派发到合适的逻辑。
多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行逻辑不同。多态依附于继承的两种含义,改变和扩展本身意味着必须有机制自动选用你改变过扩展过的版本,所以如果没有多态,继承的两种含义就不能实现。
所以多态实际上是继承的实现细节,所以不能把多态和其他两个放在一起,多态是战术层面的问题。
实践中,继承的第一种含义意义并不很大,甚至常常是有害的,它会使子类和基类出现强耦合(耦合性越强说明独立性越差)。继承的第二种含义叫做接口继承,要求做一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象。这在程序设计上称为归一化。
归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合。归一化可以大大简化使用者的处理逻辑:和带兵打仗类似,班长需要知道每个士兵的性格特长,否则就不知道该派谁去对付山坡上的狙击手,连长只需要