预计所需阅读时间:3分钟

中国古代有个故事,叫做“白马非马”。它是公孙龙提出的哲学命题:

  • 问:可以说白马与马不同吗?
  • 答:可以。
  • 问:为什么?
  • 答:“马”是对物“形”方面的规定,“白马”则是对马“色”方面的 规定,对“色”方面的规定与对“形”方面的规定性,自然是不同的。「所以说,对不同的概念加以不同规定的结果」白马与马也是不同的。

有有兴趣再深入了解的,可以自行搜索“白马非马”。

这个故事反映白不仅仅是逻辑的思辨,更是反映了“具体”与“抽象”这对哲学概念的思考。马是对白马的抽象,白马可以更加具体指本市动物园养的那一匹白马。马也可以包含动物园里的其它马。面向对象中,所有具有相同或相似性质和行为的对象的抽象就是类。而对象或实例,则是某个类的具体化的例子。马就是一个类,而那匹白马就是一个实例。

马这个类有一些相同的属性和行为,可以用来描述具体的马,例如:属性有马的颜色、马的高度、马腿的数量,行为有马都会跑、会进食、会叫。具体的马可能是白色的、棕色的、黑色的,每一匹具体的马都会叫。有些属性的值对整个类而言是一样,这种中类属性,例如马腿的数量都是4条腿。有些行为或方法对整个类而言进行操作、改变。例如,科学家对马进行基因编辑,通过这个行为让一群马长出的一对翅膀,那么马这个类就多了翅膀数量这个属性。

而马这个类,属于更大的动物类,而且马和动物这两个类都有进食的行为、颜色的属性等。动物类比马类更加抽象,而马类比动物类更加具体化,这种情况我们称之为继承。更加具体的类为子类,更抽象的类为父类,马是动物的子类,动物是马的父类。而刚刚的科学家并不是让所有有马都改变了有多少翅膀的属性,只是让部分马有了翅膀,那就建立了“飞马”这个新的类。它继承马很多属性和方法,例如:它仍然有颜色、高度,而具会像其它动物一样进食,可以说飞马是马的子类,也是动物的子类的子类。而飞马有原来马类没有的行为:飞,就是子类所独有行为。

面向对象中还有一个很重要的概念叫多态。是指由继承而产生的相关而又不同的类,其对象对同行为会做出不同的具体响应。例如,马和狮子都有进食这一方法,但当马进食会吃草,而狮子进食会吃肉。只要是动物园里的动物,属于动物这个类,我们都可以让它们进食,提供食物给它们时,它们都会吃食物。这种不用管是什么类型的动物,把肉、草给到动物它们就会吃,这也是多态的优势。

最后,我们看一面向对象的封装性这个概念。一个面向过程的程序会让马这样叫:

  • 定义某区马
  • 马设置音量、音调、音色
  • 马呼吸
  • 马发出声音

而面向对象的程序,先将叫封装到类中,任何人都可以简单使用叫的方法:

  • 实例化具体的一匹马
  • 马叫

面向对象程序设计,通过封装隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。封装是通过限制只有特定类的实例可以访问这一特定类的被保护起来的属性与方法,而它们通常利用接口实现消息的传入传出。例如,接口能确保马的年龄只能被赋予马这一类,而且外部不能轻易知道它,就像女人的年龄,无法通过外貌等外在因素来判断。