据说Smalltalk发明者Alan Kay就曾经说过: 我发明了面向对象,而我可以告诉你C++并不是我头脑里所想的东西.
面向对象的困惑
计算机里面只有数据和算法,数据用于对现实世界抽象建模,算法对数据演算,这已经很好,怎么出来一个面向对象这个"怪胎".
面向对象教学每次都要从对现实世界的模拟讲起,还记得那个会叫的鸭子的对象吗?面向对象认为对象有状态和行为,由此对现实世界抽象建模.然而现实世界就是面向对象的世界吗?
准确的说当时我所学的C++的面向对象对世界的模拟就是反世界反牛顿定理的,因为事物之间是相互作用的,C++的面向对象根本无法对现实世界抽象建模.
这就是我当时学面向对象为什么那么痛苦,面向对象和我对世界的认知是矛盾的,然而我当时却选择相信面向对象是完全正确的.
如同非欧几何一样和现实世界关系不大的东西也是有用的,起码是一个逻辑训练.也如同非欧几何一样C++的面向对象也根据一定的规则构成了自己的抽象系统.
语言是个抽象系统
每个语言根据自己的规则构成了一个抽象系统,通过抽象逻辑演绎完成任务.
面向对象是个思想
面向对象基于人对客观事物的认知,这个是自然而然的.但面向对象有多种实现方式,每个语言可以选择自己的实现方式或者自己创造一种实现方式.目前看没有一种语言能够实现一个反映客观世界的面向对象,毕竟客观世界太复杂了.正是一个不能反映客观世界的语言实现,语言引入面向对象解决了一部分问题,也因引入面向对象而制造出更多的问题.
go中的面向对象
go语言就自己创造了一种实现面向对象的方式,go里面没有了class,对象的方法也不是直接和对象绑定在一起的,对象在go里面其实就是一个算法(函数)的参数.这样把数据算法和面向对象很好的结合起来.