东风系列导弹是镇国神器。东风41不是突然就造出来的,之前有很多种东风xx导弹,每种导弹都有自己的独特之处,相同之处都具备导弹基本特点。很多工厂有量产磨具的生产线,盖房子就图纸,建筑设计建设都有参考,小到分子、原子,大到地球、星系、宇宙,似乎东西都是类似的,有的又有点不同。继承也是宇宙的本质,也是人类社会的本质,编程语言只不过发现了这个本质,程序员可以创造一个又一个相同、相似或差异甚远的实例,完成需求和功能。
单继承和多继承
狭义的多继承代表继承多个类,而非继承接口,一般提到多继承都是指狭义的多继承。大多编程语言为了简化多继承带来的复杂度,使用接口(interface)或特性(traits).
- C++是为数不多支持多继承的编程语言。
- Python也支持多继承,若未指定父类名称,访问父类相同方法名会按照继承父类的顺序依次搜素。
- Java/C#/PHP/Kotlin/仓颉 等只支持单继承,用接口实现"多继承"。
- PHP 5.0引入接口,5.4引入traits.
多继承的困扰
- 小明有时很困扰,自己的脾气很倔,妈妈说这像他爸,他爸说像他姥姥,大家都要面子,一家人吵的不可开交。
- 有人说自己是朱元璋18代后代,列出长相哪里哪里像,大部分人无法分辨,因为继承太长了,溯源也找不到实证。
- 近亲的后代更高概率产生基因缺陷,多继承同样会继承多个父类"不好"的地方,编程语言更倾向继承一个"优秀"类,继承后进一步优化子类,实现真正"优生"。
多继承策略
多继承产生一个很大的问题,继承自不同父类或父父类的相同函数以哪个为准。
- C3线性化理论是计算机编程中用于在多继承时确定继承的方法顺序。
- Python引入了Mix-in混入类实现更优雅的多重继承。
- Vue同样也有Mix-in概念。
继承的访问权限
- C++提供了private/protected/public三种继承方式,比较复杂。Java/C#/Python仅有(?)public继承,默认不需要显式指明。
- Python默认会继承父类的属性和方法,但不能继承父类私有的属性和方法(以两个下划线开头)。
继承的形式
- ObjC/C++/C#/Kotlin 用冒号分隔子类和父类。
- PHP/Java 用extends关键字。
- Python 用括号将父类包起来,形如class Base(Derived).
- 仓颉 用 <: 表示继承
不可被继承
- PHP 用 final 指代类不可被继承,final修饰的方法不可被覆盖。
- Kotlin 类默认是被final修饰,不能被继承,必须被 open 修饰才能被继承。
- 仓颉 类默认也不可被继承,必须用open修饰的类才可以被继承。
继承多接口
- C++/Java/C#/Kotlin 类均支持继承多个接口。