继承
东风系列导弹是镇国神器。东风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).
Lambda
编程语言的Lambda起源于数学Lambda演算,这是一套用于研究函数定义、函数应用和递归的形式系统,由Alonzo Church和Stephen Cole Kleene在20世纪三十年代引入。
匿名函数
匿名函数是lambda的另外一种叫法,不用像普通函数定义一样,简洁方便,在一些非FP语言也有应用。Java 8/C++ 11/C#/Python均支持。
Objective-C
ObjC比较小众,在20世纪80年代早期由Brad Cox发明。源于早期在NeXT和苹果公司使用(内部),Mac市场占有率本身就不高,ObjC没有太多程序员。在移动互联网时代iPhone开发爆发,ObjC也开始火爆。真正了解ObjC的人会觉得它算是面向对象语言中比较易学且实用的一种,不像C++那么复杂,ObjC真正做到了够用即可。
ObjC是C的面向对象扩展
- ObjC是C的超集,增加了面向对象设计,借鉴了SmallTalk消息机制,此机制允许动态判断某个对象是否有某个方法,不像C++类方法调用,编译时期就决定是否可调用。
- 习惯了C代码风格,刚开始学ObjC消息机制, 几乎无一例外感到不解和困扰,如果连续使用超过半年以上,慢慢会习惯并感受到它消息机制的”优雅”, 虽然代码没有C简洁,但清晰易懂。
- ObjC可以用GCC编译,早期苹果macOS和iOS均用GCC编译,后来转向Clang.
特别的语法
- ObjC用@表示类定义和实现,起源于Smalltalk 中,使用 @ 符号来表示类和类定义的方法。
1.0和2.0
- GNUStep只支持ObjC 1.0, 对2.0支持不完整。
Swift
苹果于2014年推出Swift, 一种更像脚本的语言,不失效率。既拥有C和ObjC的特性,又更加灵活有趣。Swift的设计目标是为了替代Objective-C,正在逐渐成为Mac和iOS主流开发语言。Swift推出了包括编程范式、函数式编程、闭包、泛型等一些列特性。
Swift历史
Swift的诞生不得不提Chris Lattner, 他是LLVM的主要发起人之一,当年苹果不满意GCC不买账苹果公司对GCC的”修改期望”, 一怒之下请他替换编译器后端为LLVM, 后面逐步到OS X10.9和 XCode 5将整个编译链从LLVM+GCC转变成LLVM+Clang.
若文章对您有帮助,欢迎关注。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。