不管是普通继承,接口继承,还是多重继承,在面向对象的编程语言中,实现起来要更加容易和直观,在面向过程的语言中,虽然可以实现,但是比较丑陋,而且本质是面向对象的思考方式。所以『继承』应该称得上是面向对象的『特性』了。介于继承带来的复杂性,现代面向对象的设计中,都推荐用组合来代替继承实现重用。
多态
『多态』本来是面向对象思想中最重要的性质(当然也算不上是特有的性质),但是教科书里都只是介绍了『多态』的表现形式,而没有介绍它用途和价值。『多态』一般表现为两种形式:
允许不同输入参数的同名函数存在。这个性质会带来一定的便利,特别是对于构造函数和操作符的重载。但这种『多态』是在编译时就确定了的,所以只能算成一种语法糖,并没有什么特别的意义。
子类可以重载父类中函数原型完全相同的同名函数。如果只看它的表现形式,在父类中存在的函数,在不同的子类中可以被重新实现,这看起来是吃饱了撑着。但是这种『多态』却是软件架构的基础,几乎所有的设计模式和方法都依赖这种特性。
隔离变化是软件架构设计的基本目标之一,接口正是隔离变化最重要的手段。我们经常说分离接口与实现,针对接口编程,主要是因为接口可以隔离变化。如果没有第二种『多态』,就没有真正意义上的接口。面向对象中的接口,不仅是指模块对外提供的一组函数,而且特指在运行时才绑定具体实现的一组函数,在编译时根本不知道这组函数是谁提供的。我们先把接口简单的理解为,在基类中定义一组函数,但是基类并没有实现它们,而在具体的子类中去实现。这不就是『多态』的第二种表现形式么。
接口怎么能够隔离变化呢?Bob大叔举了一个非常好的例子:










