重学JS 系列:聊聊继承( 二 )


重学JS 系列:聊聊继承

文章插图
这部分代码在当下看着没啥毛病,实现了车的几个基本功能,我们也可以通过子类去扩展出各种车 。
但是现在出现了新能源车,新能源车是不需要加油的 。当然除了加油这个功能不需要,其他几个车的基本功能还是需要的 。
如果新能源车直接继承车这个父类的话,就出现了第一个问题 ,大猩猩与香蕉问题 。这个问题的意思是我们现在只需要一根香蕉,但是却得到了握着香蕉的大猩猩,大猩猩其实我们是不需要的,但是父类还是强塞给了子类 。继承虽然可以重写父类的方法,但是并不能选择需要继承什么东西 。
另外单个父类很难描述清楚所有场景,这就导致我们可能又需要新增几个不同的父类去描述更多的场景 。随着不断的扩展,代码势必会存在重复,这也是继承存在的问题之一 。
除了以上两个问题,继承还存在强耦合的情况,不管怎么样子类都会和它的父类耦合在一起 。
既然出现了强耦合,那么这个架构必定是脆弱的 。一旦我们的父类设计的有问题,就会对维护造成很大的影响 。因为所有的子类都和父类耦合在一起了,假如更改父类中的任何东西,都可能会导致需要更改所有的子类 。
如何解决继承的问题
继承更多的是去描述一个东西是什么,描述的不好就会出现各种各样的问题,那么我们是否有办法去解决这些问题呢?答案是组合 。
什么是组合呢?你可以把这个概念想成是,你拥有各种各样的零件,可以通过这些零件去造出各种各样的产品,组合更多的是去描述一个东西能干什么 。
现在我们把之前那个车的案例通过组合的方式来实现 。
重学JS 系列:聊聊继承

文章插图
从上述伪代码中想必你也发现了组合比继承好的地方 。无论你想描述任何东西,都可以通过几个函数组合起来的方式去实现 。代码很干净,也很利于复用 。


推荐阅读