官术网_书友最值得收藏!

3.1 編程的抽象

所有編程語言都提供一種“抽象”的方法。抽象是簡化、解決問題的手段之一,從某種程度上來說,解決問題的復雜性與抽象的種類和質量直接相關。

在不同的編程語言中,抽象的程度有所不同。匯編語言是對機器底層的一種少量抽象。后來的許多“命令式”語言(如FORTRAN、BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們著重考慮計算機的結構,而非問題本身的結構。因此,開發人員在使用這些語言時有一定的技術門檻,因為開發人員必須要在機器模型(“解決方案空間”)與實際解決的問題模型(“問題空間”)之間建立起一種關聯關系。這個過程要求人們付出較大的精力,而且它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。

面向對象的程序設計在此基礎上跨出了一大步,程序員可利用一些工具表達“問題空間”內的元素。由于這種表達非常具有普遍性,因此不必受限于特定類型的問題。我們將問題空間中的元素以及它們在解決方案空間的表示物稱作“對象”(Object)。當然,還有一些在問題空間沒有對應的對象體。在面向對象編程(OOP)中,通過添加新的對象類型,程序可進行靈活調整,以便與特定問題配合。與現實世界的“對象”或者“物體”相比,編程“對象”與它們也存在共通的地方:它們都有自己的狀態(state)和行為(behavior)。比如,狗的狀態有名字、顏色等,狗的行為有叫喚、搖尾等。

如圖3-1所示,在狗的世界里面,根據狗的狀態和行為可以將狗劃分為不同的種類。軟件世界中的對象和現實世界中的對象類似,對象存儲狀態在字段(field)里,可通過方法(methods)暴露其行為。方法對對象的內部狀態進行操作,并作為對象與對象之間通信的主要機制。隱藏對象內部狀態,通過方法進行所有的交互,這是面向對象編程的一個基本原則——數據封裝(data encapsulation)。

圖3-1 狗的分類

下面以“狗”作為一個對象的建模(見圖3-2)。

圖3-2 “狗”作為對象的建模

狗可以通過狀態(名字、顏色)來創建不同的對象,同時也提供了訪問狗對象狀態的方法(叫喚、搖尾)。

編程語言中的對象可以抽象為以下特征:

· 一切皆對象。可將對象想象成一種新型變量,保存著數據,但可要求它對自身進行操作。從理論上講,可從要解決的問題本身提出所有概念性的組件,然后在程序中將其表達為一個對象。

· 程序是一大堆對象的組合。通過消息傳遞,各對象知道自己該做些什么。為了向對象發出請求,需向那個對象“發送一條消息”。更具體地講,可將消息想象為一個調用請求,它調用的是從屬于目標對象的一個方法或函數。

· 每個對象都有自己的存儲空間,可容納其他對象?;蛘哒f,通過封裝現有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但是在程序中卻可達到任意高的復雜程度。

· 每個對象都有一種類型。根據語法,每個對象都是某個“類”的一個“實例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能接收什么樣的消息”。

· 同一類所有對象都能接收相同的消息。由于類型為“狗”(Dog)的一個對象也屬于類型為“動物”(Animal)的一個對象,因此一條狗完全能接收動物的消息。這意味著可讓程序代碼統一指揮“動物”,令其自動控制所有符合“動物”描述的對象,其中自然包括“狗”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。

主站蜘蛛池模板: 葫芦岛市| 瓮安县| 华池县| 贡山| 永福县| 乐亭县| 宜昌市| 黑水县| 崇信县| 伊宁县| 浦东新区| 宿松县| 鹰潭市| 通许县| 阿坝县| 通城县| 郓城县| 太仓市| 靖安县| 安陆市| 获嘉县| 巴林左旗| 玉溪市| 洛川县| 广水市| 呼和浩特市| 临沭县| 太原市| 平定县| 资讯 | 合阳县| 宜良县| 景德镇市| 永昌县| 电白县| 同江市| 荔浦县| 孟州市| 桑日县| 莆田市| 瓮安县|