面向对象
被问到什么是面向对象时回答封装、继承、多态几乎已经是一种条件反射,今天写这篇文章想重新理解一下到底什么是面向对象,或者想问为什么是“封装、继承、多态”。
面向对象从何而来
回到面向对象刚刚出现的时候,我们需要知道面向对象的编程思维是为了解决什么样的问题而提出的。
面向对象程序设计的雏形,早在1960年代的Simula语言中即可发现,当时的程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。20世纪70年代的Smalltalk语言在面向对象方面堪称经典——以至于30年后的今天依然将这一语言视为面向对象语言的基础。
通过维基百科的介绍,我们可以知道,随着软硬件的发展,工程的规模随之增大。面对庞大的项目,过去那些基于过程得到的代码变的难以维护。而面向对象的提出是通过强调代码的可重复性解决过去代码难以维护的问题。
如果基于这一点,即面向对象是为了指导代码编写者如何写出可重复的代码再来理解面向对象的三大特性。
基于抽象
面向对象的思想通过类与对象这两个基本概念来构建整个程序。
- 类(Class):定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
- 对象(Object):是类的实例(Instance)。
类可以看作对现实世界的抽象,而对象是经由这个抽象生成的实例。在面向过程的编程里我们需要描述一个”人“,我们需要先知道人的年龄,性别等等具体的值,然后我们通过这些具体的值来描述一个”人“。而在面向对象的编程里,我们描述一个人,最先要做的是确定一个人具有哪些属性,然后通过给这些抽象的概念一个确定的值,这样我们就得到了一个”人“。
这是一种思维方式的转变,即抽象的思维。而抽象的思维能大大提高我们代码的可读性与复用率。
为什么是”封装、继承、多态“
如果我们继续按照这个思路来理解封装、继承、多态
封装
封装是一种处理对象与对象之间关系的方法,在面向对象的编程思想里,所以的实体都 是以对象作为基本单位。而每个对象都有自己的属性和方法。当我们用类将些对象重新的 组合之后,让他表达出新的属性和行为的过程就是封装。
继承
同样的,继承是一种处理类与类之间关系的方法。在面向对象的编程思想里,类是对现实世界的抽象,而现实世界中的”类“本身就天然有继承关系,这是一个粗略到具体的过程,还是以人为例,我们可以得到以下概念,人是一种_动物,人是一种哺乳动物,人是一种陆生哺乳动物,人是一种两足行走的陆生哺乳动物_…或者人是一种动物,人是一种灵长目动物,人是一种具有高等智慧的灵长目动物…类似的例子可以写出许多,为了满足这种对事物抽象的需求,就天然的要求语言具有继承的能力。
具体的,继承让代码实现共享,提高代码的重用性和可读性。
多态
多态可以理解为是对继承打的补丁,当我们在抽象出一个类之后,我们可能仍然无法很好的表达自己的想法。以陆生哺乳动物的行走方法举例,显然所有的陆生哺乳动物都可以行走,但有的陆生哺乳动物是两足直立行走(人),有的陆生哺乳动物是跳跃着前进(兔子),有的陆生哺乳动物是爬行(老鼠)。在有些情况下,我们需要对统一行为(公有方法)进行不同表达。这是基于继承自然而然的设计。