Javascript继承(下) 为何要继承
Quiz1
Javascript真的需要类(Class)么?
我们首先先看下其他有类(Class)的面向对象语言(如: Java)的一些特性。
父类与子类
父类(Superclass)和子类(Subclass),并不是为了解决父亲与儿子的 问题,而是为了解决类的包含关系的,我们用Sub表示“子类”,用Sup表示“父类”,则有:
Sub Sup
这是有区别的,例如通常我们能够将子类当成父类来使用,但认人的时候我们并不能把儿子当成父亲。
或者可以这 么说,父类和子类不是为了解决类间存在相同方法或者属性的。
举个例子
有人喜欢这样做:
我们需 要一些动物的类,以便在屏幕上创建一些移动的动物,但移动的动物有些在空中飞行,有些在路上行走。
所以创建 两个父类,一个是Fly,一个是Walk:
Class Fly{ fly(){} } Class Walk{ walk(){} }
然后狮子们(还可以再建些其他的在路上行走的动物)就属于Walk类,老鹰们(也还可以再建些其他在天上飞行 的动物)就属于Fly类:
Class Lion extend Walk{ } Class Eagle extend Fly{ }
最后对Lion和Eagle类创建一些实例,调用相应的方法,屏幕上就会有一些狮子和老鹰在移动了。
但这可 能并不是一个好的设计,比如明天老板突然一拍大脑,他要有一种叫天马(Pegasus)的动物,它们即会在天上飞,又会在 路上走,时而要飞行,时候要行走。
在这种情况下,这个方案就全然无用了。
为什么这个设计失败了?
继承是有条件的,子类必须能严格的向上转型(变成父类)。
在上面这个例子中:
狮子(Lion)被 假设等同于行走动物(Walk),老鹰(Eagle)被假设等同于飞行动物(Fly)。
这看起来很成功,因为子类能严格向上 转型,但他有隐患。
当有一种天马(Pegasus)介入到里面的时候,我们才发现狮子其实只是“会行走的动物”,老鹰其 实只是“会飞行的动物”,这不意味着动物一辈子只能飞行或者行走,所以即会飞行又会行走的天马就找不到自己的归属了 。
这个例子很好的证明了,子类和父类不是为了解决类间具有相同的方法的:
一些动物都会行走,需要拥有 行走(Walk)这个方法,但这不应该由子类和父类实现。