C艹 面向对象程序设计学习笔记

废稿。

阿巴阿巴,因为最近要开始整活所以要学一些没用的。

本帖主要通过与面向过程编程设计对比来了解面向对象程序设计。

定义

根据百度百科:

  • 面向过程(Procedure Oriented)(PO)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。简写为POP。
  • 面向对象(Object Oriented)(OO)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

???这啥???

其实百科底下还有一段话:

面向过程(C语言)

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象(c++,c#,java,delphi)

是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

也就是说,
面向过程执行一些方法(每个方法都看做是一个过程或者函数);
面向对象给一些对象赋予属性和方法,让每个对象执行自己的方法(函数)。

举个例子就很好懂了。

比如用洗衣机洗衣服这个任务:

  • 面向过程:
    • 执行加洗衣粉方法;
    • 执行加水方法;
    • 执行清洗方法;
    • 执行晾干方法。
  • 面向对象:
    • 定义对象“人”和“洗衣机”;
    • 赋予“人”属性和方法:“加洗衣粉方法”、“晾干方法”;
    • 赋予“洗衣机”属性和方法:“加水方法”、“清洗方法”;
    • 执行 人.加洗衣粉
    • 执行 洗衣机.加水
    • 执行 洗衣机.清洗
    • 执行 人.晾干

同样是完成用洗衣机洗衣服这个过程,面向过程直接用一个个方法(过程)来解决,而面向对象则先抽象出一系列对象,然后让对象执行方法。

特点

面向过程的优点是效率高,缺点是可维护性差。
面向对象则相反。

形象的说,

面向过程就像 Switch Lite,方便、快捷(效率高),但由于它是一体化机身设计,有一个部件坏了就只能整机送去维修(可维护性差);
面向对象则像原版 Switch,虽然更重、更不方便(效率较低),但因为没有一体化机身设计,一些部件(如摇杆)坏了可以只维修或替换摇杆,十分灵活(可维护性好)。

再打个比方,

面向过程就像雕版印刷,有一个地方出问题就得整块板重来;
面向对象则像活字印刷,有一个地方出问题只要把出问题的那块毛坯重新做一遍就好了。

在板上雕刻一个个字,相当于是一个个过程,前后关联很大,维护起来较麻烦;
一个个毛坯则像是一个个对象,由于相互关联没有或是很小,维护起来很方便。

再打个比方,

面向过程就像蛋炒饭,而面向对象则像盖浇饭。
蛋炒饭入味,但如果你不喜欢蛋或饭里的葱花,因为饭和菜融合度很高,就只能整盘倒掉;
盖浇饭虽然较蛋炒饭不很入味,但如果你不喜欢你不喜欢盖料,因为饭和菜融合度很低,处理起来较蛋炒饭会方便许多。

面向对象

一些概念

继承

百度百科:

继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率。在这里举一个例子,当类X继承了类Y后,此时的类X则是一个派生类,而类Y属于一个基类。继承是从一般演绎到特殊的过程,可以减少知识表示的冗余内容,知识库的维护和修正都非常方便。更有利于衍生复杂的系统。

???这啥???

以下引用自知乎大佬 @呜呜轩轩:

继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用父类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。

写得非常明白,我不多说了。

百度百科:

类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。

封装

百度百科:

封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。

换句话说,封装就是将对象抽象成类的过程,并且这个类对自己的数据和方法可以进行隐藏或公开,即设置不同的保护级别。

多态

百度百科:

多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。

就是说,类能通过一个共同的类来调用相同的方法并进行不同的拓展。

特征

对象唯一性

就是指每个对象有各自唯一的标识。

抽象性

体现在将对象抽象成类。类是对象的抽象而对象则是类的具体化(实例)。

继承性

用来形容类与类间的关系,即子类共享父类属性和方法的关系。

多态性

指同一种方法用于不同的对象上能获得不同的结果。

参考: