OOP_面向對象程式設計概述

来源:https://www.cnblogs.com/whale90830/archive/2019/03/07/10488576.html
-Advertisement-
Play Games

李際軍老師“面向對象程式設計”課程第一課筆記整理 面向對象程式設計概述 20世紀90年代以來面向對象程式設計(Object Oriented Programming, 簡稱OOP) 迅速地在全世界流行, 並一躍成為程式設計的主流技術。 現在,面向對象程式設計的思想已經被越來越多的軟體設計人員所接受, ...


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

面向對象程式設計概述

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. 能很好地適應新的硬體環境
    • 面向對象程式設計中的對象、消息傳遞等思想和機制,與分散式、並行處理、多機系統及網路等硬體環境恰好吻合。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "知乎原鏈" 本文為 "中文代碼示例之5分鐘入門TypeScript" 的 "CTS" 版本. CTS作者是@htwx(github). 它實現了關鍵詞和標準庫的所有命名漢化. 本文並未使用附帶的vscode相關插件(包括CTS語言插件和拼音輸入插件), 與原Typescript教程類似, 只用了命 ...
  • 前段時間做了微信自定義分享的功能,分享出的頁面存在邀請碼在ios手機上複製失敗的問題,然而在PC端和安卓機上是沒有問題的。百度了一下,基本給出的解決方案是:ios不單純支持on,為點擊的元素添加空點擊事件:onclick="",眾說芸芸,但是試了下沒一個有用! 如果你複製的文本內容來自是input的 ...
  • 題目 169. 求眾數 給定一個大小為 n 的數組,找到其中的眾數。眾數是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。 你可以假設數組是非空的,並且給定的數組總是存在眾數。 示例 1: 示例 2: 眾數(Mode)是統計學名詞,在統計分佈上具有明顯集中趨勢點的數值,代表數據的一般水平(眾數可以不 ...
  • 一、什麼是橋接模式 橋接模式(Bridge Pattern):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體(Handle and Body)模式或介面(Interface)模式。 二、橋接模式的結構 在橋接模式結構圖中包含如下幾個角色: ●Abstract ...
  • 如果第二次看到我的文章,歡迎右側掃碼訂閱我喲~ 👉 本文長度為5389字,建議閱讀14分鐘。 堅持原創,每一篇都是用心之作~ 沒想到這篇文章寫了這麼長,一時半會沒消化完的話,可以收藏一下先。 這是「伸縮性」章節的第四篇,先給新來的小伙伴們簡單回顧下前三篇的內容。 做「伸縮性」最重要的就是先做好「無 ...
  • Gobelieve 架構 Gobelieve github地址 im 客戶連接伺服器 (可分散式部署,暫無負載均衡模塊) imr 路由查詢伺服器(主要解決im分散式部署的問題) ims 存儲伺服器 (主從部署) 基礎模塊 1.數據包協議 包:header(12)|body header:len(4) ...
  • 很久之前的讀書整理內容,躺在草稿里很久了。。。 一、 "開放-封閉"原則(OCP) Open-Closed Principle原則講的是:一個軟體實體應當對擴展開放,對修改關閉。 優點: 通過擴展已有軟體系統,可以提供新的行為,以滿足對軟體的新的需求,使變化中的軟體有一定的適應性和靈活性。 已有軟體 ...
  • 環境搭建 使用的Eclipse版本: Oxygen.1a Release (4.7.1a) Build id: 20171005 1200, 通過添加 "Xtext Download" 上列出的Releases update site安裝xtext IDE和xtext SDK. 之後打開Eclips ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...