一、引言
当我们打开招聘网站时,通常看到职位要求的第一条便是“有面向对象编程思想”,但往往这一条会被大多数人忽视,心想“不就是写几个类吗,我将具体的事物抽象一下就是喽!”,对,你说的一点都没错,但我要说,你对面向对象的思想还只停留在表层。
当我们遇到一个问题或者是接触一种新的思想时,往往只关心其字面上的意思,并没有真正的去深究这其中的道理,这种浅尝辄止的思维方式已经根深到大多数人的思维习惯中。科学之所以诞生 在西方,与西方人刨根问底的精神是离不开的。
当芝诺提出飞矢不动论(飞着的箭在任何瞬间都是既非静止又非运动的)时,所有古希腊人都
芝诺问他的学生:“一支射出的箭是动的还是不动的?” “那还用说,当然是动的。” “确实是这样,在每个人的眼里它都是动的。可是,这支箭在每一个瞬间里都有它的位置吗?” “在这一瞬间里,它占据的空间和它的体积一样吗?” “有确定的位置,又占据着和自身体积一样大小的空间。” “那么,在这一瞬间里,这支箭是动的,还是不动的?” “不动的,老师” “这一瞬间是不动的,那么其他瞬间呢?” “也是不动的,老师” “所以,射出去的箭是不动的?”
会参与到这个看似无稽的问题中,但正是因为这样的探索和质疑之声才促进了文明的发展。在我国,甚至比芝诺更早,就已经有人提出了类似的问题,例如“飞鸟之影,未尝动也”等言论,但这都仅仅停步于此,如果谁去探讨这样的问题,会被当作是不学无术。
二、一个实验
好,请你耐住性子,在引入主题前,我先请你做个实验:
假设存在一片虚无空间,里面完全为空,现让你创建一个适宜人类居住的生活环境,那么请问,你会如何做,如何创建?这里,请你先思考三分钟再往下看。
思考三分钟哦
好,我想没有人的想法会脱离下面的这些:
1. 温度,空气,水,土壤,光等生命要素。
2. 山川,河海等地理环境。
3. 森林,各种动植物,微生物。
4. 各种自然规律。
5. 生活要素。
6. 其他。
三、面向对象
好,以上这些都是我们根据自身的认知模型所创造出来的具体事物,而你自己也默默的充当了一次造物主的角色,那么提出今天的问题:在计算机的世界里,什么是面向对象呢?
所谓面向对象,即:计算机世界是人类真实世界的映射,而真实世界中的人类认知模型概念,我们在计算机编程中把它统称为类,而以类的方式构建程序模型,我称之为面向对象编程。
也许你还不太了解,就拿上面的实验比喻:
那块虚无空间在计算机中,可类比计算机中的内存;
你所创造出的物体,在面向对象编程中称之为实例;
你的认知模型(猫,狗等概念)在编程中称之为类。
讲到这里,你可能就会体会到不管是Java,C++亦或是其它语言的书籍当中,你见到的第一句话就是“万物皆为类”,这么五个字,它恰恰也诠释了什么叫面向对象编程,也许你现在还不明白,但等你有足够多的编程经验后,终会发现这五个字的深刻含义。
四、如何创建类
既然知道了面向对象就是面向类,那么我们应如何来创建类呢。要知道一只猫之所以区别于一只狗,是因为它有着不同于狗的特性,例如,它的声线可以使它的叫声为“喵”,它的胡子可以帮它抓到老鼠,它发达的肌肉系统可以帮助它跳的很高等等,一切属于猫的属性,都决定了它是一只猫。所以当一个物体具有了某方面的属性后,它便获得了相应的能力,所以我们在创建类之前,必须明确这是个什么类,它应该具备哪些属性,如果它多了某种属性,它就不再是猫,那么这个属性就是不能要的。所以创建类的思维方法,我总结如下(希望重点牢记):
1.计算机中要尽可能的还原真实世界,所以要提高自己对真实世界的认知水平,为类赋予它应有的属性,去掉那些本不属于它的属性。
2.属性决定了类所具有的能力,能力反映了类所具有的属性,如果这个类只有get和set方法,那么这便不是个类,只是存储数据的一个结构罢了,那这个类的设计也是失败的。
3.打破思维惯性,尝试寻找类与类的差异与共性,将共性升华,使其变成抽象类,在你自己的认知水平上构造连接虚拟与现实的模型框架。抽象类之所以不能实例化对象,是因为如果一名美术老师让你画一只哺乳动物,那你知道要怎么画吗,唯独他说让你画猫,你才会画。
4.类不仅仅包括我们看得到摸得到的实物,还包括诸如管理制度,自然规律,社会礼法等,所以类是开放的,多元的,所以你的思维要保持广度和深度。
5.时刻以造物主的身份,创造并设计你的软件构成,让它符合真实世界的认知。
好,今天便讨论到这里,如有疑问或不同意见,欢迎大家一起讨论,只有各抒己见,我们才会越接近真相。
文章最后,我提出一个问题,如果一只猫,多了一条腿变成五条,那它还是猫吗,如果变成6,7,8。。。无穷尽条腿,它还是猫吗,这个我会在下次的分享讨论中给出我的看法。
如果你对我的文章感兴趣,就感激关注吧,你的支持就是我的动力。
更多分享请关注微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。