继承你不知道的奥秘(《继承》)
东风系列导弹是镇国神器。东风41不是突然就造出来的,之前有很多种东风xx导弹,每种导弹都有自己的独特之处,相同之处都具备导弹基本特点。很多工厂有量产磨具的生产线,盖房子就图纸,建筑设计建设都有参考,小到分子、原子,大到地球、星系、宇宙,似乎东西都是类似的,有的又有点不同。继承也是宇宙的本质,也是人类社会的本质,编程语言只不过发现了这个本质,程序员可以创造一个又一个相同、相似或差异甚远的实例,完成需求和功能。
单继承和多继承
狭义的多继承代表继承多个类,而非继承接口,一般提到多继承都是指狭义的多继承。大多编程语言为了简化多继承带来的复杂度,使用接口(interface)或特性(traits).
- C++是为数不多支持多继承的编程语言。
- Python也支持多继承,若未指定父类名称,访问父类相同方法名会按照继承父类的顺序依次搜素。
- Java/C#只支持单继承,用接口实现"多继承"。
- 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#用冒号分隔子类和父类。
- Java用extends关键字。
- Python用括号将父类包起来,形如class Base(Derived).
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。