前面分別聊完了什麼是「物件」、「類別」、「介面」,接下來,就要來聊聊物件導向程式設計當中的四大概念:「抽象」、「封裝」、「繼承」、「多型」
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 怎麼解釋抽象這件事情