封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这就是所有设计模式的基础,就是封装变化,因此封装的作用就是解决程序的可扩展性。
继承:子类继承父类,可以继承父类的方法和属性,实现了多态以及代码的重用,因此解决了系统的重用性和扩展性。但是继承破坏了封装,因为它是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性。所以,继承需要慎用,只有明确的is-a关系才能使用。同时继承是在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发这滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合而不是继承,是面向对象开发中一个重要的经验。
多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装中提到,找到变化部分并封装起来,但是封装起来后怎么适应接下来的变化?这正是接口的作用,主要目的是为不相关的类提供通用的处理服务。设想一下,鸟会飞,但是超人也会飞,可以让鸟和超人都实现飞这个接口,这样维护飞这个行为或者后来又有其他对象实现飞接口就会很方便,如此便体现了系统的可维护性和可扩展性。