面向对象编程是最为广泛使用的编程范式之一,它的名字就定义了它的工作原理,“面向对象”——“对象”起着重要的作用,操作对象并得到结果是面向对象编程的最终目标。

使用面向对象编程范式的语言称为面向对象编程语言,它们大多是高级语言,例如:

  • Java
  • C#
  • Python — Python 既是脚本语言、结构化语言,也是面向对象语言。

为了进行面向对象编程,我们会使用一些面向对象的概念,它们简化了面向对象编程,并为其增添了更多价值。

这些概念如下:

  • 封装
  • 抽象
  • 多态
  • 继承

在了解这些概念之前,我们需要了解“类”和“对象”。

对象是面向对象编程中基本的运行实体。日常生活中我们就能看到很多对象,如电视、手机、狗、人、汽车,以及其他有生命或无生命的对象。这些都可以被描述为面向对象编程中的对象。

是一张蓝图或一个原型,它定义了特定一类对象共有的变量/属性和方法/函数,它是一种逻辑组件。

简单来说,“类”是用户定义的数据类型,“对象”是类的变量。构造了“类”以后,我们可以根据需要创建任意数目的对象。

例如,我们构造一个名为“树” (Tree) 的类,“树”这个类的状态/属性就是:

  • 树的名称 (Name)
  • 树的年龄 (Age)
  • 树的类型 (Type)
  • 树的高度 (Height)

状态/属性用于定义对象的属性,也就是说,状态/成员/属性都代表相同的东西。

“树”的动作行为可以是:

  • 结果实
  • 落叶
  • 从根部吸收水分运往上部
  • 形成树荫

然后,我们可以用“树”类定义一个变量 Mango (芒果树) 。我们可以通过创建 Mango 对象来存储和访问我们之前为“树”类定义的所有属性和行为。

用“树” (Tree) 类创建 Mango 这个对象的语法是:

Tree  Mango;

封装

你食用过彩色外壳的胶囊吗?

pills_tablets_medicine_capsule_heal_drugs_pharmacy_nutrient_additives-859474.jpg-d

药物是被封装好存进胶囊里的,里面的药物存放得非常安全,肉眼是看不到的,想要知道里面是什么必须得拆开外壳。

相似地,所有数据成员(变量/属性/成员)行为(函数/方法)都被放到一起,并封装起来。“类”就是“封装”最好的例子。

打个比方,你正在药店买一些处方药,你把处方交给药师,TA 会帮你在店里拿好药。

在这个场景中,药品——充当了 变量/成员/属性,药师——作为成员函数/方法,TA 把药拿给你,你——外部的应用程序或其他软件的代码

image?w=431&h=300&rev=30&ac=1&parent=1co9lGXLHg9idixOA7Dssbv3whQYlkF3jd5n9wWo0Oaw

通过封装可以限制外部代码访问内部的数据,比如你可以在实现代码的时候这么定义:只有在类中定义的函数才能访问类的成员。程序员是可以在开发过程中指定成员变量的可访问性的,而不是像过程化语言那样使所有变量全局化。这种可访问性的控制也称为信息隐藏

封装允许公开必要的东西,也能把重要的东西对外界藏起来。因此,类隐藏的部分就像封装,显露的部分像抽象

抽象

通过抽象,我们不用解释太多就可以显露类的必要特性。今天早上我想泡杯热茶,要用水壶烧水,我简简单单按下启动按钮烧水,我不想知道水壶内部怎么工作的,我不想知道它有什么高电阻、电阻产热、水沸腾之类的,反正我能简单地烧好水就行了。因此,按下“启动”按钮烧水就被称为“抽象”。

类似地,通过遥控器的帮助,我们用简单的几个键就能操控电视。

数据抽象是一种编程技巧,它取决于接口具体实现能否分离开来。

在面向对象编程时,数据抽象的概念可以来自两种类型的类:

  • 抽象类:(0-100)% 的抽象
  • 接口类:100% 的抽象

继承

顾名思义,每个人从出生起都有从家庭遗传的特征,你可能会有祖父母或父母的一些特征,这也正是“继承”在面向对象编程中的作用。

image?w=424&h=268&rev=130&ac=1&parent=1co9lGXLHg9idixOA7Dssbv3whQYlkF3jd5n9wWo0Oaw

类可以拥有它的“父类”的属性和方法,父类也被称为基类,继承基类的类称为“派生类”。继承是面向对象编程最强大的功能了。

有效地使用继承可以节省大量时间,还能减少程序中的错误,进而为我们提高工作质量和生产力。

继承有不同的类型:

  • 单继承(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