关於抽象

前面分别聊完了什麽是「物件」、「类别」、「介面」,接下来,就要来聊聊物件导向程序设计当中的四大概念:「抽象」、「封装」、「继承」、「多型」

什麽是抽象

In software engineering and computer science, abstraction is:

  • the process of removing physical, spatial, or temporal details or attributes in the study of objects or systems to focus attention on details of greater importance; it is similar in nature to the process of generalization;
  • the creation of abstract concept-objects by mirroring common features or attributes of various non-abstract objects or systems of study – the result of the process of abstraction.

在软件工程和电脑科学中,广义来说「抽象」代表

  • 一种移除物件或系统细节、专注在真正重要的事情上的过程。像是一种归纳的过程
  • 一种为实际物件建立「映射(相对应)的概念」的过程

关於「归纳」和「建立概念」这两件事情,其实我们在日常生活中就已经常常使用到。

举例来说,当我们将「可以被握在手中、盛装食物或饮料的东西」归纳起来,并建立一个叫做「杯子」的概念。之後当我们谈到杯子的时候,就会知道杯子是什麽、可以做什麽。

另一方面,当我们看到一个从来没有看过,但同样可以被握在手中、盛装食物或饮料的东西,就会将它归类在「杯子」这个概念之中。

In object-oriented programming theory, abstraction involves the facility to define objects that represent abstract "actors" that can perform work, report on and change their state, and "communicate" with other objects in the system.

在物件导向程序设计当中,「抽象」代表一种能力,一种可以定义物件的抽象角色,以及这个抽象角色所可以完成的工作、改变状态、与其他物件沟通的能力。

如果以实际的例子来看,我们将全世界的生物依据「界门纲目科属种」的方法来分类,就是一种抽象。当我们提到「灵长目」的时候,它并不是一个实际的动物或个体,它只是一种「描述」,描述在这个分类之下的所有动物,具备什麽样的特徵或能力。

先前提到的「抽象类别」和「介面」也是抽象的一种。它们自己本身不是一个实际的物件,也无法产生实例,它们只是一种「描述」,描述实际执行 (extends or implements) 它们的物件,具备什麽样的属性或方法。

为什麽要抽象

看到这里,就会发现先前所提到的「抽象类别」或「介面」,其实就是实现「抽象」的方式。

而实现抽象的好处是什麽呢?由於抽象提取了概念、移除(或隐藏)实作细节,只关注在重要的部分,让我们更有能力去面对众多的事物。

譬如我们开始为事物分类,分类的方式本身就「抽取」不同事物共同的特性,然後将它们归类成同类。接者,我们继续在不同的类别当中寻找相同的特性,「抽取」出来成为 parent 类别。就像是科学家用「界门纲目科属种」整理世界千千万万种生物。

抽取共同特性、将事物分类整理完之後可以做什麽呢?接下来我们就可以很容易进行沟通。

譬如我们在讨论杯子的时候,可以直接根据杯子这个「概念」进行讨论,不需要特别针对某一个实际存在的杯子来讨论。当你跟朋友说「我早上用杯子喝了一杯咖啡」,你的朋友不需要知道你实际用的杯子的颜色、大小、重量,而会直接知道那是一个可以盛装液体的容器。所以当我们使用杯子这个概念时,就已经在

  • 隐藏细节(颜色、大小、重量等)
  • 专注在重点(可以盛装液体的容器)

另一方面,有了抽象概念之後,我们就很容易可以进行延伸。譬如发明一个全新材质的杯子 (延伸使用杯子的概念),或是讨论晚餐餐具的组合 (讨论杯子的 parent 类别与其 child 类别) 等等。

抽象与物件导向

所以回到物件导向程序设计上,我们要用物件来模拟世界上的事物,但我们无法完整模拟所有存在的事物,因此需要抽象概念,来帮助我们快速建构、模拟世界运作的方式。并且「隔离其他不重要的事情,只专注在重要的事物上」。

抽象可以说是物件导向程序设计的开始。


最後,来看看 CS50 的 Professor David J. Malan 怎麽解释抽象这件事情


<<:  [前端暴龙机,Vue2.x 进化 Vue3 ] Day12.事件处理

>>:  【第七天 - Flutter Api、Json 物件教学】

[SQL]取20天的平均

天啊.怎麽做啊? 同事用了一个聪明的作法, XD 这麽简单,怎麽没想到呢?脑袋卡卡! 我们先来做一下...

[铁人赛 Day06] React 中如何拦截网站 Runtime 错误?- Error boundaries

前言 前一篇 Code Spliting 文章中有提到用 Error boundaries 来处理载...

[Android Studio 30天自我挑战] EditText的元件介绍

EditText与TextView相似,但EditText用於APP需要输入资料时,例如:输入姓名、...

Day11_HTML语法8

标示超连结 < a>元素是用来标示超连结,常使用的属性为< href> &l...

程序进化论:一行表达式 Single-expression functions

「学姐,你今天发生什麽事了吗?」 「嗯⋯⋯」唯心没有马上回应诗忆的问题。 「是不是太累了?其实剩下的...