面向对象编程是最为广泛使用的编程范式之一,它的名字就定义了它的工作原理,“面向对象”——“对象”起着重要的作用,操作对象并得到结果是面向对象编程的最终目标。
使用面向对象编程范式的语言称为面向对象编程语言,它们大多是高级语言,例如:
- Java
- C#
- Python — Python 既是脚本语言、结构化语言,也是面向对象语言。
为了进行面向对象编程,我们会使用一些面向对象的概念,它们简化了面向对象编程,并为其增添了更多价值。
这些概念如下:
- 封装
- 抽象
- 多态
- 继承
在了解这些概念之前,我们需要了解“类”和“对象”。
对象是面向对象编程中基本的运行实体。日常生活中我们就能看到很多对象,如电视、手机、狗、人、汽车,以及其他有生命或无生命的对象。这些都可以被描述为面向对象编程中的对象。
类是一张蓝图或一个原型,它定义了特定一类对象共有的变量/属性和方法/函数,它是一种逻辑组件。
简单来说,“类”是用户定义的数据类型,“对象”是类的变量。构造了“类”以后,我们可以根据需要创建任意数目的对象。
例如,我们构造一个名为“树” (Tree) 的类,“树”这个类的状态/属性就是:
- 树的名称 (Name)
- 树的年龄 (Age)
- 树的类型 (Type)
- 树的高度 (Height)
状态/属性用于定义对象的属性,也就是说,状态/成员/属性都代表相同的东西。
“树”的动作行为可以是:
- 结果实
- 落叶
- 从根部吸收水分运往上部
- 形成树荫
然后,我们可以用“树”类定义一个变量 Mango (芒果树) 。我们可以通过创建 Mango 对象来存储和访问我们之前为“树”类定义的所有属性和行为。
用“树” (Tree) 类创建 Mango 这个对象的语法是:
Tree Mango;
封装
你食用过彩色外壳的胶囊吗?
药物是被封装好存进胶囊里的,里面的药物存放得非常安全,肉眼是看不到的,想要知道里面是什么必须得拆开外壳。
相似地,所有数据成员(变量/属性/成员)和 行为(函数/方法)都被放到一起,并封装起来。“类”就是“封装”最好的例子。
打个比方,你正在药店买一些处方药,你把处方交给药师,TA 会帮你在店里拿好药。
在这个场景中,药品——充当了 变量/成员/属性,药师——作为成员函数/方法,TA 把药拿给你,你——外部的应用程序或其他软件的代码
通过封装可以限制外部代码访问内部的数据,比如你可以在实现代码的时候这么定义:只有在类中定义的函数才能访问类的成员。程序员是可以在开发过程中指定成员变量的可访问性的,而不是像过程化语言那样使所有变量全局化。这种可访问性的控制也称为信息隐藏。
封装允许公开必要的东西,也能把重要的东西对外界藏起来。因此,类隐藏的部分就像封装,显露的部分像抽象。
抽象
通过抽象,我们不用解释太多就可以显露类的必要特性。今天早上我想泡杯热茶,要用水壶烧水,我简简单单按下启动按钮烧水,我不想知道水壶内部怎么工作的,我不想知道它有什么高电阻、电阻产热、水沸腾之类的,反正我能简单地烧好水就行了。因此,按下“启动”按钮烧水就被称为“抽象”。
类似地,通过遥控器的帮助,我们用简单的几个键就能操控电视。
数据抽象是一种编程技巧,它取决于接口和具体实现能否分离开来。
在面向对象编程时,数据抽象的概念可以来自两种类型的类:
- 抽象类:(0-100)% 的抽象
- 接口类:100% 的抽象
继承
顾名思义,每个人从出生起都有从家庭遗传的特征,你可能会有祖父母或父母的一些特征,这也正是“继承”在面向对象编程中的作用。
类可以拥有它的“父类”的属性和方法,父类也被称为基类,继承基类的类称为“派生类”。继承是面向对象编程最强大的功能了。
有效地使用继承可以节省大量时间,还能减少程序中的错误,进而为我们提高工作质量和生产力。
继承有不同的类型:
- 单继承(Single Inheritance)
- 分层继承(Hierarchical Inheritance)
- 多继承(Multiple Inheritance)
- 多层继承(Multi Level Inheritance)
多态
Polymorphism(多态)是一个希腊词语,指的是具有多种形态或超载的能力。比如说我们都知道的编程中的函数,它们在括号内接受不同的参数,多态性也只是具有相同名字的函数,传递不同的参数来得到结果。
以名为 sum 的函数为例,它可以带 2 或 3 个参数:
sum(3,4) sum(10,23,56)
通过提供适当数量的参数来调用这些函数,将根据被调用函数的设计方式给出相应结果。
程序如何区分上述情况,来决定执行哪个函数呢?
面向对象编程中有一个名为动态绑定的功能,会根据程序的执行来调用实际的函数。当程序执行 2 个参数的函数时,编译器就会用 2 个参数的函数来执行,3 个参数的函数同理。
在实际运行之前,编译器并不知道到底需要调用哪个函数,这取决于程序会如何调用函数名。这也被称为迟绑定。
面向对象编程的用途
- 使用封装(信息隐藏)可以对外部隐藏数据
- 使用继承可以重用代码
- 使用多态可以重载操作符/方法/函数,即相同的函数名或操作符名称可用于多种任务
- 数据抽象可以用抽象实现
- 项目易于迁移(可以从小项目转换成大项目)
- 同一项目分工
- 软件复杂性可控
面向对象编程的应用领域
- 人工智能与专家系统
- 企业级应用
- 神经网络与并行编程
- 办公自动化系统
希望你阅读后能对面向对象概念有简要的了解,也希望我能在将来的文章中写到如何进行面向对象编程。
原文:https://www.freecodecamp.org/news/object-oriented-concepts/,作者:Parathan Thiyagalingam