李際軍老師“面向對象程式設計”課程第一課筆記整理 面向對象程式設計概述 20世紀90年代以來面向對象程式設計(Object Oriented Programming, 簡稱OOP) 迅速地在全世界流行, 並一躍成為程式設計的主流技術。 現在,面向對象程式設計的思想已經被越來越多的軟體設計人員所接受, ...
李際軍老師“面向對象程式設計”課程第一課筆記整理
面向對象程式設計概述
20世紀90年代以來面向對象程式設計(Object Oriented Programming, 簡稱OOP) 迅速地在全世界流行, 並一躍成為程式設計的主流技術。
現在,面向對象程式設計的思想已經被越來越多的軟體設計人員所接受,不僅因為它是一種最先進的新穎的電腦程式設計思想,更主要的是這種新的思想更接近人的思維活動, 人們利用這種思想進行程式設計時,可以很大程度地提高編程能力, 減少軟體維護的開銷。
面向對象程式設計方法是通過增加軟體的可擴充性和可重用性來提高程式員的編程能力的。這種思想與我們以前使用的方法有很大的不同,並且在理解上有一些難點。
什麼是面向對象程式設計
新的程式設計範型
程式設計範型是指設計程式的規範、 模型和風格, 它是一類程式設計語言的基礎。
- 面向過程程式設計範型:
- 程式=過程+調用
程式=演算法+數據結構
如C、 Pascal、 Ada
函數式程式設計範型:程式被看作“描述輸入與輸出之間關係” 的數學函數。
如LISP
- 面向對象程式設計是一種新型的程式設計範型。 這種範型的主要特征是:
- 對象=(演算法+數據結構)
- 程式=對象+消息
面向對象程式的主要結構特點:
- 第一,程式一般由類的定義和類的使用兩部分組成,在主程式中定義各對象並規定它們之間傳遞消息的規律。
- 第二,程式中的一切操作都是通過向對象發送消息來實現的,對象接收到消息後,啟動有關方法完成相應的操作。
面向對象程式設計的基本概念
- 對象
- 類
- 消息
- 方法
1. 對象
在現實世界中,任何事物都是對象。可以是有形的具體存在的事物, 也可以是無形的抽象的事件。
現實世界中的對象,具有以下特性:
- 名字: 用於區別不同的實體
- 屬性/狀態: 屬性用於描述不同實體的特征;狀態由這個對象的屬性和這些屬性的當前值決定
- 操作: 用於描述不同實體可具有的行為,是對象提供給她用戶的一種服務,也叫行為或方法
- 一類是自身所承受的操作
- 一類是施加於其他對象的操作。
在面向對象程式設計中,對象是描述其屬性的屬性及對這些數據施加的一組操作封裝在一起構成的統一體。
對象一般可以表示為: 屬性+操作(方法)
- 方法(Method)——就是對象所能執行的操作,即服務。方法描述了對象執行操作的演算法,響應消息的方法。在C++中稱為成員函數。
- 屬性(Attribute)——就是類中所定義的數據,它是對客觀世界實體所具有性質的抽象。C++中稱為數據成員。
思考:
- 下列關於對象的描述不正確的是( )
- A 對象只能描述有形的東西
- B 對象具有屬性和服務兩個主要因素
- C 現實世界中的一切事物都可以看作對象,但只有在具體的統中加以論述才有實際的意義
D 對象的屬性是對象的靜態特征,服務是動態特征,並且對象的屬性只能由本對象的服務來操作
A
- 構成對象的兩個主要因素是( 屬性 )和(服務),其中(服務)屬於動態屬性,(屬性)屬於靜態屬性,(屬性)只能由(服務)來操作。
2. 類
在實現世界中,“類”是一組具有相同屬性和行為的對象的抽象。
類和對象之間的關係是抽象和具體的關係。 類是多個對象進行綜合抽象的結果,一個對象是類的一個實例。
在面向對象程式設計中, 類就是具有相同數據和相同操作的一組對象的集合。 是對具有相同數據結構和相同操作的一類對象的描述。
在面向對象程式設計中, 總是先聲明類, 再由類生成其對象。
確定一個事物是一個類的步驟:
- 判斷它是否有一個以上的實例,若有則可能是一個類
- 判斷類的實例中有否絕對的不同點,若無則是一個類
- 如:顏色與鮮花聯繫在一起只是鮮花的一種狀態,因為表示顏色的是一些值:紅、黃、紫、白等, ++不是一個類++;
- 而顏色同包括複雜顏色電腦的圖形處理系統聯繫在一起,這時的顏色是基於顏色三元素(紅、綠、藍)的成分比例和色度的變數,可以附帶很多行為,所以++是一個類++。
可以看出,一次能正確劃分類是不可能的,所以需要不斷的對實際問題進行分析和整理。
註意:不能把一組函數組合在一起構成類!即類不是函數的集合。
如例,定義類Mathhelper
:
class Mathhelper{
public:
double sqrt(double aNumber);
double power(double aNumber,int raiseto);
double inverse(double aNumber);
private:
};
分析有何不妥!沒有需要管理的私有數據!
思考:
- 關於類和對象的說法不正確的是()
- A 類是對象的類,對象是類的對象
- B 系統不為類分配記憶體空間,而為對象分配記憶體空間
- C 如果把人看作動物,那麼細菌也是動物
- D 類可以看作數據類型,對象也可以叫做對象的實體、實例等
類是()的集合,分類的依據是()
具有相同屬性和服務的一組對象 抽象
3. 消息
面向對象設計技術必須提供一種機制允許一個對象與另一個對象的交互,這種機制叫消息傳遞。
在面向對象程式設計中,一個對象向另一個對象發出的請求被稱為“消息”。當對象收到消息時,就調用有關的方法,執行相應的操作。消息是一個對象要求另一個對象執行某個操作的的規格說明,通過消息傳遞才能完成對象之間的相互請求或相互協作。
消息具有三個性質:
- 同一個對象可以接收不同形式的多個消息,作出不同的響應。
- 相同形式的消息可以傳遞給不同的對象,所作出的響應可以是不同的。
- 對消息的響應並不是必需的, 對象可以響應消息, 也可以不響應
消息分兩類
- 公有消息(其它對象發出)
- 私有消息(向自己發出)
一個消息由三部分組成:
- 接收消息的對象;
- 消息名;
- 零個或多個變元。
4. 方法
方法就是對象所能執行的操作。方法包括界面和方法體兩部分。
- 方法的界面就是消息的模式,它給出了方法調用的協議;
- 方法體則是實現某種操作的一系列計算步驟,就是一段程式。
在C++語言中方法是通過函數來實現的,稱為成員函數
消息和方法的關係
對象根據接收到的消息,調用相應的方法;反過來, 有了方法,對象才能響應相應的消息。
面向對象程式設計的基本特征
- 抽 象
- 封 裝
- 繼 承
- 多 態
1. 抽象
抽象是人類認識問題的最基本的手段之一。
抽象是通過特定的實例(對象)抽取共同性質以後形成概念的過程。抽象是對系統的簡化描述和規範說明,他強調了系統中的一部分細節和特性,而忽略了其他部分。
抽象包括兩個方面:數據抽象和代碼抽象(或稱行為抽象)。前者描述某類對象的屬性和狀況,也就是此類對象區別於彼類對象的特征物理量;後者描述了某類對象的共同行為特征或具有的共同操作。
在面向對象的程式設計方法中,對一個具體問題的抽象分析結果,是通過類來描述和實現的。
2. 封裝 encapsulation
在現實世界中,封裝就是把某個事物包圍起來,使外界不知道該事物的具體內容。
在面向對象程式設計中,封裝是指把數據和實現操作的代碼集中起來放在對象內部,並儘可能隱蔽對象的內部細節。
封裝應該具有如下幾個條件:
- 對象具有一個清晰的邊界,操作的代碼被封裝在該邊界內
- 具有一個描述對象與其他對象如何相互作用的介面,該介面必須說明消息如何傳遞的使用方法
- 對象內部的代碼和數據應受到保護,其他對象不能直接修改。
思考:
- 對象的封裝就是()
- A 與世隔絕
- B 只進不出
- C 可進可出,但是外界不能幹涉內部的處理過程
D 封裝只是抽象的封裝,外界可以直接干預
C
- 關於類的繼承不正確的是()
- A 引入類的繼承目的就是為了代碼重用,提高編程效率
- B 子女有父母的特征是類的繼承
- C 子繼父產業是類的繼承
D 子類可以全部繼承父類的屬性和服務,也可部分繼承父類的屬性和服務
C
3. 繼承 inheritance
繼承是在一個已經建立的類的基礎上再接著聲明一個新類的擴展機制,原先已經建立的類稱為基類,在基類之下擴展的類稱為派生類,派生類又可以向下充當繼續擴展的基類,因此構成層層派生的一個動態擴展過程。
派生類享有基類的數據結構和演算法,而本身又具有增加的行為和特性,因此繼承的機制促進了程式代碼的可重用性。
一個基類可以有多個派生類,一個派生類反過來可以具有多個基類,形成複雜的繼承樹層次體系。
基類與派生類之間有一個本質的關係
基類是一個簡單的類,描述相對簡單的事物,派生類是一個複雜些的類,處理相對複雜的現象。
這樣一種簡單到複雜的關係正是人們認識自然過程的線性映射,軟體的可擴充性建立在這樣一種對自然的正確回歸上便擁有了堅實的基礎。
繼承的作用:
- 避免公用代碼的重覆開發,減少代碼和數據冗餘。
- 通過增強一致性來減少模塊間的介面。
- 繼承分為單繼承和多繼承。
4. 多態 polymorphism
多態性是指不同的對象收到相同的消息時產生多種不同的行為方式。
C++支持兩種多態性:編譯時的多態性(重載)和運行時的多態性(虛函數)。
為什麼要使用面向對象程式設計
傳統程式設計方法的局限性
- 傳統程式設計開發軟體的生產效率低下,存在重用性、複雜性和可維護性問題
- 重用性:傳統程式設計從語句一級開始編程,缺乏大粒度、可重用性的構件。
- 複雜性:傳統程式設計數據與操作分離,如果一個或多個數據的結構發生變化,將波及程式的很多部分甚至整個程式。
- 可維護性:傳統程式設計數據與操作相分離的結構使得維護數據和處理數據的操作過程要花費大量的時間和精力。
- 傳統程式設計難以應付日益龐大的信息量和多樣的信息
類型- 當代電腦所處理的數據已從最簡單的數據和字元發展為具有多種格式的多媒體數據,如文本、圖形、圖像、影像、聲音等。面對龐大的信息量和多樣的信息格式,傳統程式設計無法應付。
- 傳統的程式設計難以適應各種新環境
- 當前,並行處理、分散式、網路和多機系統等節點之間的通信機制傳統的程式設計技術很難處理。
面向對象程式設計的主要優點
- 可提高程式的重用性
- “類”作為大粒度的構件提高了程式的重用性。
- 兩種重覆使用類的方法:
- 建立在各種環境下都能使用的類庫或對象集。
- 從基類派生出子類
- 可控製程序的複雜性
- 通過”類“聯繫數據及對數據的操作,有效控制了程式的複雜性
- 可改善程式的可維護性
- 消息傳遞機制使得對方法體中的任何修改不會導致發送消息的程式修改
- 類的封裝和信息隱藏機制使得外界對其中的數據和程式代碼的非法操作成為不可能。
- 能夠更好地支持大型程式設計
- 類作為一個程式模塊,比通常的子程式的獨立性強的多。
- 動態連接和繼承機制進一步發展了基於數據抽象的模塊化設計。
- 增強了電腦處理信息的範圍
- 用類來直接描述現實世界中的類型,可使電腦系統的描述和處理對象從數據擴展到現實世界和思維世界的各種事物,大大擴展了電腦系統處理的信息量和信息類型。
- 能很好地適應新的硬體環境
- 面向對象程式設計中的對象、消息傳遞等思想和機制,與分散式、並行處理、多機系統及網路等硬體環境恰好吻合。