因为“面向对象”本来就不是什么严肃的学术理论,而是基于工程实践提出的“更优实践”-遗憾的是,它最初的萌芽是正确的、后来的解释却是错的;幸好,这个错误没有持续太久就被纠正了:这就是为何“面向对象三要素”一看就东拼西凑、而且工程师根据实践经验迅速反击那套谬论、给出了更靠谱的“组合优于继承”原则的原因。
再换句话说:最初的面向对象实践Simula 67*做出了对象、消息抽象;而这个抽象进一步精确化为“接口/原型+”和“自适应派发”(多态+)这两个概念。
其中,接口/原型概念的本质是“归一化”,也就是可以用同样的逻辑处理所有兼容对象;而“多态”其实是归一化这个概念的附属概念一通过“封装””,把程序分成了“对外接口”和“内部实现”两个区域,从而允许“接口兼容就能任意替换”且“内部修改不影响外部”。而为了“接口兼容就能任意普换”,自然就需要多态。
你看,原本两个概念是并列的,业界却给弄成了“接口”和“多态”这两个不同层面的概念,这里是不是就出现了偏差?
不仅如此,接下来,业界开始犯更大的错:他们发现,概念之间存在递进关系。比如车,四轮车,轿车.….…….这是不是层层递进的?是不是我们实现了车,四轮车就只是“四个轮子的车”,而轿车则是多了个内燃机及其操控系统的“四个轮子的车”?
如此一来,当我们声明“轿车是一种汽车”时,是不是直接把“飞汽车”的代码绑到轿车里面,就不用重写关于汽车的很多代码了?
于是,他们把这个概念也添加进来,这就是“继承”。