- C++面向?qū)ο蟪绦蛟O(shè)計(第三版)
- 陳維興 林小茶
- 2816字
- 2019-10-25 14:55:27
1.1.2 面向?qū)ο蟪绦蛟O(shè)計的基本概念
為了掌握面向?qū)ο蟪绦蛟O(shè)計技術(shù),我們從最基本的概念入手。本節(jié)介紹的內(nèi)容是面向?qū)ο蟪绦蛟O(shè)計的理論基礎(chǔ),它們不依賴于具體的程序設(shè)計語言,也就是說,無論使用哪種面向?qū)ο笳Z言進行面向?qū)ο蟪绦蛟O(shè)計,本節(jié)內(nèi)容都有指導(dǎo)意義。
1.對象
在此,我們討論的對象具有兩方面的含義,即在現(xiàn)實世界中的含義和面向?qū)ο蟪绦蛟O(shè)計中的含義。
在現(xiàn)實世界中,任何事物都是對象。它可以是一個有形的、具體存在的事物,如一粒米、一名學(xué)生、一輛汽車,甚至一個星球。它也可以是一個無形的、抽象的事件,如一次演出、一場球賽、一次出差等。對象既可以很簡單,也可以很復(fù)雜,復(fù)雜的對象可以由若干簡單的對象構(gòu)成,整個世界都可以認(rèn)為是一個非常復(fù)雜的對象。
現(xiàn)實世界中的對象既具有靜態(tài)的屬性(或稱狀態(tài)),又具有動態(tài)的行為(或稱操作、功能)。例如,每個人都有姓名、性別、年齡、身高、體重等屬性,都有吃飯、走路、睡覺、學(xué)習(xí)等行為。所以,在現(xiàn)實世界中,對象一般可以表示為屬性+行為。
現(xiàn)實世界中的對象具有以下特性:
(1)每一個對象必須有一個名字以區(qū)別于其他對象。
(2)用屬性來描述它的某些特征。
(3)有一組操作,每個操作決定對象的一種行為。
(4)對象的操作可以分為兩類:一類是自身所承受的操作,另一類是施加于其他對象的操作。
在面向?qū)ο蟪绦蛟O(shè)計中,對象是描述其屬性的數(shù)據(jù)以及對這些數(shù)據(jù)施加的一組操作封裝在一起構(gòu)成的統(tǒng)一體。對象可以認(rèn)為是數(shù)據(jù)+操作。對象所能完成的操作表示它的動態(tài)行為,通常也把操作稱為方法。
為了幫助讀者理解對象的概念,圖1-1形象地描繪了具有3個操作的對象。

圖1-1 具有3個操作的對象示意圖
下面我們用一臺錄音機比喻一個對象,通俗地說明對象的某些特點。
錄音機上有若干按鍵,如Play(播放)、Rec(錄音)、Stop(停止)、Rew(倒帶)等,當(dāng)人們使用錄音機時,只要根據(jù)自己的需要如放音、錄音、停止、倒帶等按下與之對應(yīng)的鍵,錄音機就會完成相應(yīng)的工作。這些按鍵安裝在錄音機的表面,人們通過它們與錄音機交互。人們無法(當(dāng)然也沒必要)操作錄音機的內(nèi)部電路,因為它們被裝在機殼里,錄音機的內(nèi)部情況對于用戶來說是隱蔽的、不可見的。也就是該對象向公眾開放的操作。
當(dāng)我們用錄音機比喻對象時,使用對象向公眾開放的操作就好像使用錄音機的按鍵,只需知道該操作的名字(如錄音機的鍵名)和所需要的參數(shù)(用于提供附加信息或設(shè)置狀態(tài),好像聽錄音前先裝錄音帶并把錄音帶轉(zhuǎn)到指定位置),根本無須知道實現(xiàn)這些操作的方法。事實上,實現(xiàn)對象操作的代碼和數(shù)據(jù)是隱藏在對象內(nèi)部的,一個對象好像是一個黑盒子,表示它內(nèi)部狀態(tài)的數(shù)據(jù)和實現(xiàn)各個操作的代碼,都被封裝在這個黑盒子內(nèi)部,在外面是看不見的,更不能從外面去訪問或修改這些數(shù)據(jù)或代碼。
使用對象時只需知道它向外界提供的接口形式而無須知道它的內(nèi)部實現(xiàn)算法,不僅使得對象的使用變得非常簡單、方便,而且具有很高的安全性和可靠性。可見面向?qū)ο蟪绦蛟O(shè)計中的對象來源于現(xiàn)實世界,更接近人們的思維。
2.類
在實現(xiàn)世界中,類是一組具有相同屬性和行為的對象的抽象。例如,張三、李四、王五等,雖然每個人的性格、愛好、職業(yè)、特長等各有不同,但是他們的基本特征是相似的,都具有相同的生理構(gòu)造,都能吃飯、說話、走路等,于是把他們統(tǒng)稱為“人”類,而具體的每一個人是人類的一個實例,也就是一個對象。
類和對象之間的關(guān)系是抽象和具體的關(guān)系。類是多個對象進行綜合抽象的結(jié)果,一個對象是類的一個實例。例如,“學(xué)生”是一個類,它是由千千萬萬個具體的學(xué)生抽象而來的一般概念。
類在現(xiàn)實世界中并不真正存在。例如,在地球上并沒有抽象的“人”,只有一個個具體的人,如張三、李四、王五等。同樣,世界上沒有抽象的“學(xué)生”,只有一個個具體的學(xué)生。
在面向?qū)ο蟪绦蛟O(shè)計中,類是具有相同的數(shù)據(jù)和相同的操作的一組對象的集合,也就是說,類是對具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的一類對象的描述。例如,“學(xué)生”類可由學(xué)號、姓名、性別、成績等表示其屬性的數(shù)據(jù)項和對這些數(shù)據(jù)的錄入、修改和顯示等操作組成。
在C++中把類中的數(shù)據(jù)稱為數(shù)據(jù)成員,類中的操作是用函數(shù)來實現(xiàn)的,這些函數(shù)稱為成員函數(shù)。
在面向?qū)ο蟪绦蛟O(shè)計中,總是先聲明類,再由類生成其對象。類是建立對象的“模板”,按照這個模板所建立的一個個具體的實例,通常稱為對象。打個比方,手工制作月餅時,先雕刻一個有凹下圖案的木模,然后在木模上抹油,接著將事先揉好的面塞進木模里,用力擠壓后,將木模反扣在桌上,一個漂亮的圖案就會出現(xiàn)在月餅上了。這樣,就可以制造出外形一模一樣的月餅。這個木模就好比是“類”,制造出來的月餅好比是“對象”。
3.消息
現(xiàn)實世界中的對象不是孤立存在的實體,它們之間存在著各種各樣的聯(lián)系,正是它們之間的相互作用、聯(lián)系和連接,才構(gòu)成了世間各種不同的系統(tǒng)。同樣,在面向?qū)ο蟪绦蛟O(shè)計中,對象之間也需要聯(lián)系,稱之為對象的交互。面向?qū)ο蟪绦蛟O(shè)計技術(shù)必須提供一種機制允許一個對象與另一個對象的交互,這種機制稱為消息傳遞。
在面向?qū)ο蟪绦蛟O(shè)計中的消息傳遞實際是對現(xiàn)實世界中的信息傳遞的直接模擬。以實際生活為例,每一個人可以為他人服務(wù),也可以要求他人為自己服務(wù)。當(dāng)需要別人為自己服務(wù)時,必須告訴他們需要的是什么服務(wù),也就是說,要向其他對象提出請求,其他對象接到請求后,才會提供相應(yīng)的服務(wù)。
在面向?qū)ο蟪绦蛟O(shè)計中,一個對象向另一個對象發(fā)出的請求稱為“消息”。當(dāng)對象接收到發(fā)向它的消息時,就調(diào)用有關(guān)的方法,執(zhí)行相應(yīng)的操作。消息是一個對象要求另一個對象執(zhí)行某個操作的規(guī)格說明,通過消息傳遞才能完成對象之間的相互請求或相互協(xié)作。例如,有一位教師對象張三和一名學(xué)生對象李四,對象李四可以發(fā)出消息,請求對象張三演示一個實驗,當(dāng)對象張三接收到這個消息后,確定應(yīng)完成的操作并執(zhí)行之。
一般情況下,稱發(fā)送消息的對象為發(fā)送者或請求者,稱接收消息的對象為接收者或目標(biāo)對象。對象中的聯(lián)系只能通過消息傳遞來進行。接收對象只有在接收到消息時,才能被激活,被激活的對象會根據(jù)消息的要求完成相應(yīng)的功能。
消息具有以下3個性質(zhì):
(1)同一個對象可以接收不同形式的多個消息,做出不同的響應(yīng)。
(2)相同形式的消息可以傳遞給不同的對象,所做出的響應(yīng)可以是不同的。
(3)對消息的響應(yīng)并不是必需的,對象可以響應(yīng)消息,也可以不響應(yīng)。
4.方法
在面向?qū)ο蟪绦蛟O(shè)計中的消息傳遞實際是對現(xiàn)實世界中的信息傳遞的直接模擬。調(diào)用對象中的函數(shù)就是向該對象傳送一個消息,要求該對象實現(xiàn)某一行為(功能、操作)。對象所能實現(xiàn)的行為(操作),在程序設(shè)計方法中稱為方法,它們是通過調(diào)用相應(yīng)的函數(shù)來實現(xiàn)的,在C++中方法是通過成員函數(shù)來實現(xiàn)的。
方法包括界面和方法體兩部分。方法的界面給出了方法名和調(diào)用協(xié)議(相對于C++中成員函數(shù)的函數(shù)名和參數(shù)表);方法體則是實現(xiàn)某種操作的一系列計算步驟,也就是一段程序(相對于C++中成員函數(shù)的函數(shù)體)。消息和方法的關(guān)系是:對象根據(jù)接收到的消息,調(diào)用相應(yīng)的方法;有了方法,對象才能響應(yīng)相應(yīng)的消息。
- Learning AWS Lumberyard Game Development
- Mastering Unity Shaders and Effects
- 3D少兒游戲編程(原書第2版)
- Visual Basic程序設(shè)計
- 微服務(wù)架構(gòu)深度解析:原理、實踐與進階
- Solr Cookbook(Third Edition)
- Java程序員面試筆試寶典(第2版)
- Mastering ArcGIS Enterprise Administration
- 從Power BI到Analysis Services:企業(yè)級數(shù)據(jù)分析實戰(zhàn)
- 貫通Tomcat開發(fā)
- Node.js區(qū)塊鏈開發(fā)
- 零基礎(chǔ)學(xué)C++(升級版)
- Python硬件編程實戰(zhàn)
- 從零開始學(xué)UI:概念解析、實戰(zhàn)提高、突破規(guī)則
- Mastering Embedded Linux Programming