1. 程式人生 > >OOP_面向對象程序設計概述

OOP_面向對象程序設計概述

類庫 操作 清晰 基類 ada 聲音 sca pro 一段

李際軍老師“面向對象程序設計”課程第一課筆記整理

面向對象程序設計概述

20世紀90年代以來面向對象程序設計(Object Oriented Programming, 簡稱OOP) 迅速地在全世界流行, 並一躍成為程序設計的主流技術。

現在,面向對象程序設計的思想已經被越來越多的軟件設計人員所接受,不僅因為它是一種最先進的新穎的計算機程序設計思想,更主要的是這種新的思想更接近人的思維活動, 人們利用這種思想進行程序設計時,可以很大程度地提高編程能力, 減少軟件維護的開銷。

面向對象程序設計方法是通過增加軟件的可擴充性可重用性來提高程序員的編程能力的。這種思想與我們以前使用的方法有很大的不同,並且在理解上有一些難點。

什麽是面向對象程序設計

新的程序設計範型

程序設計範型是指設計程序的規範、 模型和風格, 它是一類程序設計語言的基礎。

  • 面向過程程序設計範型:
    • 程序=過程+調用
    • 程序=算法+數據結構

      如C、 Pascal、 Ada

  • 函數式程序設計範型:程序被看作“描述輸入與輸出之間關系” 的數學函數。

    如LISP

  • 面向對象程序設計是一種新型的程序設計範型。 這種範型的主要特征是:
    • 對象=(算法+數據結構)
    • 程序=對象+消息

面向對象程序的主要結構特點:

  • 第一,程序一般由類的定義類的使用兩部分組成,在主程序中定義各對象並規定它們之間傳遞消息的規律。
  • 第二,程序中的一切操作都是通過向對象發送消息
    來實現的,對象接收到消息後,啟動有關方法完成相應的操作。

面向對象程序設計的基本概念

  1. 對象
  2. 消息
  3. 方法

1. 對象

在現實世界中,任何事物都是對象。可以是有形的具體存在的事物, 也可以是無形的抽象的事件。

現實世界中的對象,具有以下特性:

  • 名字: 用於區別不同的實體
  • 屬性/狀態: 屬性用於描述不同實體的特征;狀態由這個對象的屬性和這些屬性的當前值決定
  • 操作: 用於描述不同實體可具有的行為,是對象提供給她用戶的一種服務,也叫行為或方法
    • 一類是自身所承受的操作
    • 一類是施加於其他對象的操作。

在面向對象程序設計中,對象是描述其屬性的屬性及對這些數據施加的一組操作封裝在一起構成的統一體

對象一般可以表示為: 屬性+操作(方法)

  • 方法(Method)——就是對象所能執行的操作,即服務。方法描述了對象執行操作的算法,響應消息的方法。在C++中稱為成員函數
  • 屬性(Attribute)——就是類中所定義的數據,它是對客觀世界實體所具有性質的抽象。C++中稱為數據成員
思考:
  1. 下列關於對象的描述不正確的是( )
  • A 對象只能描述有形的東西
  • B 對象具有屬性和服務兩個主要因素
  • C 現實世界中的一切事物都可以看作對象,但只有在具體的統中加以論述才有實際的意義
  • D 對象的屬性是對象的靜態特征,服務是動態特征,並且對象的屬性只能由本對象的服務來操作

    A

  1. 構成對象的兩個主要因素是( 屬性 )和(服務),其中(服務)屬於動態屬性,(屬性)屬於靜態屬性,(屬性)只能由(服務)來操作。

2. 類

在實現世界中,“”是一組具有相同屬性行為的對象的抽象。

對象之間的關系是抽象具體的關系。 類是多個對象進行綜合抽象的結果,一個對象是類的一個實例。

在面向對象程序設計中, 類就是具有相同數據和相同操作的一組對象的集合。 是對具有相同數據結構和相同操作的一類對象的描述。

在面向對象程序設計中, 總是先聲明類, 再由類生成其對象。

確定一個事物是一個類的步驟:
  1. 判斷它是否有一個以上的實例,若有則可能是一個類
  2. 判斷類的實例中有否絕對的不同點,若無則是一個類
  • 如:顏色與鮮花聯系在一起只是鮮花的一種狀態,因為表示顏色的是一些值:紅、黃、紫、白等, ++不是一個類++;
  • 而顏色同包括復雜顏色計算機的圖形處理系統聯系在一起,這時的顏色是基於顏色三元素(紅、綠、藍)的成分比例和色度的變量,可以附帶很多行為,所以++是一個類++。

可以看出,一次能正確劃分類是不可能的,所以需要不斷的對實際問題進行分析和整理。

註意:不能把一組函數組合在一起構成類!即類不是函數的集合。

如例,定義類Mathhelper

class Mathhelper{
public:
    double sqrt(double aNumber);
    double power(double aNumber,int raiseto);
    double inverse(double aNumber);
private:
};

分析有何不妥!沒有需要管理的私有數據!

思考:
  1. 關於類和對象的說法不正確的是()
  • A 類是對象的類,對象是類的對象
  • B 系統不為類分配內存空間,而為對象分配內存空間
  • C 如果把人看作動物,那麽細菌也是動物
  • D 類可以看作數據類型,對象也可以叫做對象的實體、實例等
  1. 類是()的集合,分類的依據是()

    具有相同屬性和服務的一組對象 抽象

3. 消息

面向對象設計技術必須提供一種機制允許一個對象與另一個對象的交互,這種機制叫消息傳遞

在面向對象程序設計中,一個對象向另一個對象發出的請求被稱為“消息”。當對象收到消息時,就調用有關的方法,執行相應的操作。消息是一個對象要求另一個對象執行某個操作的的規格說明,通過消息傳遞才能完成對象之間的相互請求或相互協作。

消息具有三個性質:
  1. 同一個對象可以接收不同形式的多個消息,作出不同的響應。
  2. 相同形式的消息可以傳遞給不同的對象,所作出的響應可以是不同的。
  3. 對消息的響應並不是必需的, 對象可以響應消息, 也可以不響應
消息分兩類
  • 公有消息(其它對象發出)
  • 私有消息(向自己發出)
一個消息由三部分組成:
  • 接收消息的對象;
  • 消息名;
  • 零個或多個變元。

4. 方法

方法就是對象所能執行的操作。方法包括界面和方法體兩部分。

  • 方法的界面就是消息的模式,它給出了方法調用的協議;
  • 方法體則是實現某種操作的一系列計算步驟,就是一段程序。

在C++語言中方法是通過函數來實現的,稱為成員函數

消息和方法的關系

對象根據接收到的消息,調用相應的方法;反過來, 有了方法,對象才能響應相應的消息。

面向對象程序設計的基本特征

  1. 抽 象
  2. 封 裝
  3. 繼 承
  4. 多 態

1. 抽象

抽象是人類認識問題的最基本的手段之一。

抽象是通過特定的實例(對象)抽取共同性質以後形成概念的過程。抽象是對系統的簡化描述和規範說明,他強調了系統中的一部分細節和特性,而忽略了其他部分。

抽象包括兩個方面:數據抽象代碼抽象(或稱行為抽象)。前者描述某類對象的屬性和狀況,也就是此類對象區別於彼類對象的特征物理量;後者描述了某類對象的共同行為特征或具有的共同操作。

在面向對象的程序設計方法中,對一個具體問題的抽象分析結果,是通過描述和實現的。

2. 封裝 encapsulation

在現實世界中,封裝就是把某個事物包圍起來,使外界不知道該事物的具體內容。

在面向對象程序設計中,封裝是指把數據和實現操作的代碼集中起來放在對象內部,並盡可能隱蔽對象的內部細節。

封裝應該具有如下幾個條件:

  1. 對象具有一個清晰的邊界,操作的代碼被封裝在該邊界內
  2. 具有一個描述對象與其他對象如何相互作用的接口,該接口必須說明消息如何傳遞的使用方法
  3. 對象內部的代碼和數據應受到保護,其他對象不能直接修改。
思考:
  1. 對象的封裝就是()
  • A 與世隔絕
  • B 只進不出
  • C 可進可出,但是外界不能幹涉內部的處理過程
  • D 封裝只是抽象的封裝,外界可以直接幹預

    C

  1. 關於類的繼承不正確的是()
  • A 引入類的繼承目的就是為了代碼重用,提高編程效率
  • B 子女有父母的特征是類的繼承
  • C 子繼父產業是類的繼承
  • D 子類可以全部繼承父類的屬性和服務,也可部分繼承父類的屬性和服務

    C

3. 繼承 inheritance

繼承是在一個已經建立的類的基礎上再接著聲明一個新類的擴展機制,原先已經建立的類稱為基類,在基類之下擴展的類稱為派生類,派生類又可以向下充當繼續擴展的基類,因此構成層層派生的一個動態擴展過程。

派生類享有基類的數據結構和算法,而本身又具有增加的行為和特性,因此繼承的機制促進了程序代碼的可重用性。

一個基類可以有多個派生類,一個派生類反過來可以具有多個基類,形成復雜的繼承樹層次體系

基類與派生類之間有一個本質的關系

基類是一個簡單的類,描述相對簡單的事物,派生類是一個復雜些的類,處理相對復雜的現象。

這樣一種簡單到復雜的關系正是人們認識自然過程的線性映射,軟件的可擴充性建立在這樣一種對自然的正確回歸上便擁有了堅實的基礎。

繼承的作用:
  • 避免公用代碼的重復開發,減少代碼和數據冗余。
  • 通過增強一致性來減少模塊間的接口。
  • 繼承分為單繼承和多繼承。

4. 多態 polymorphism

多態性是指不同的對象收到相同的消息時產生多種不同的行為方式

C++支持兩種多態性:編譯時的多態性(重載)和運行時的多態性(虛函數)。

為什麽要使用面向對象程序設計

傳統程序設計方法的局限性
  1. 傳統程序設計開發軟件的生產效率低下,存在重用性、復雜性和可維護性問題
    • 重用性:傳統程序設計從語句一級開始編程,缺乏大粒度、可重用性的構件。
    • 復雜性:傳統程序設計數據與操作分離,如果一個或多個數據的結構發生變化,將波及程序的很多部分甚至整個程序。
    • 可維護性:傳統程序設計數據與操作相分離的結構使得維護數據和處理數據的操作過程要花費大量的時間和精力。
  2. 傳統程序設計難以應付日益龐大的信息量和多樣的信息
    類型
    • 當代計算機所處理的數據已從最簡單的數據和字符發展為具有多種格式的多媒體數據,如文本、圖形、圖像、影像、聲音等。面對龐大的信息量和多樣的信息格式,傳統程序設計無法應付。
  3. 傳統的程序設計難以適應各種新環境
    • 當前,並行處理、分布式、網絡和多機系統等節點之間的通信機制傳統的程序設計技術很難處理。

面向對象程序設計的主要優點

  1. 可提高程序的重用性
    • “類”作為大粒度的構件提高了程序的重用性。
    • 兩種重復使用類的方法:
      • 建立在各種環境下都能使用的類庫或對象集。
      • 從基類派生出子類
  2. 可控制程序的復雜性
    • 通過”類“聯系數據及對數據的操作,有效控制了程序的復雜性
  3. 可改善程序的可維護性
    • 消息傳遞機制使得對方法體中的任何修改不會導致發送消息的程序修改
    • 類的封裝和信息隱藏機制使得外界對其中的數據和程序代碼的非法操作成為不可能。
  4. 能夠更好地支持大型程序設計
    • 類作為一個程序模塊,比通常的子程序的獨立性強的多。
    • 動態連接和繼承機制進一步發展了基於數據抽象的模塊化設計。
  5. 增強了計算機處理信息的範圍
    • 用類來直接描述現實世界中的類型,可使計算機系統的描述和處理對象從數據擴展到現實世界和思維世界的各種事物,大大擴展了計算機系統處理的信息量和信息類型。
  6. 能很好地適應新的硬件環境
    • 面向對象程序設計中的對象、消息傳遞等思想和機制,與分布式、並行處理、多機系統及網絡等硬件環境恰好吻合。

OOP_面向對象程序設計概述