• 正文
    • 1 面向過(guò)程與面向?qū)ο?/span>
    • 2 對(duì)象的概念
    • 3 類(lèi)的概念
    • 4 面向?qū)ο蟮奶匦?/span>
    • 5 總結(jié)
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

01/13 13:45
1675
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

本篇,來(lái)介紹面向?qū)ο蟮幕靖拍睢?/p>

1 面向過(guò)程與面向?qū)ο?/h2>

面向過(guò)程與面向?qū)ο螅莾煞N不同的編程思想。

1.1 面向過(guò)程

面向過(guò)程的思路,是按照問(wèn)題的解決步驟,將程序分解為一個(gè)個(gè)具體的函數(shù)或過(guò)程,然后依次調(diào)用這些函數(shù)來(lái)實(shí)現(xiàn)程序的功能。

面向?qū)ο蟮某绦蛟O(shè)計(jì),程序的執(zhí)行流程比較直觀,按照步驟一次執(zhí)行,適合處理簡(jiǎn)單的,單線程的任務(wù)。

1.2 面向?qū)ο?/h3>

面向?qū)ο蟮乃悸?,是將事物抽象成?duì)象,每個(gè)對(duì)象有自己的屬性(變量)和方法(函數(shù))。對(duì)象是程序的基本單元,通過(guò)對(duì)象之間的交互、消息傳遞等來(lái)實(shí)現(xiàn)程序的功能。

2 對(duì)象的概念

2.1 對(duì)象數(shù)據(jù)

保存在對(duì)象中的數(shù)據(jù),描述了該對(duì)象的狀態(tài)。在面向?qū)ο笾校瑪?shù)據(jù)被稱(chēng)為屬性。

例如,一個(gè)員工的屬性,可以包含員工號(hào)、生日、性別、電話號(hào)碼等。

2.2 對(duì)象行為

對(duì)象的行為,表示這個(gè)對(duì)象可以做什么。在面向?qū)ο笾?,?shù)據(jù)被稱(chēng)為方法。

例如,員工對(duì)象的方法,可以有setGender()和getGender()來(lái)設(shè)置和獲取性別。

3 類(lèi)的概念

3.1 類(lèi)與對(duì)象

類(lèi)可以理解為對(duì)象的藍(lán)圖。在實(shí)例化一個(gè)對(duì)象時(shí),是基于這個(gè)類(lèi)來(lái)構(gòu)建對(duì)象。

類(lèi)也可以理解為是對(duì)象的模板或模具,用來(lái)創(chuàng)建對(duì)象。

例如,創(chuàng)建一個(gè)整數(shù)或浮點(diǎn)數(shù):

int x;
float y;

也可以使用自定義的類(lèi)來(lái)創(chuàng)建對(duì)象

myClass myObject;

3.2 類(lèi)的屬性、方法和消息

以一個(gè)Person類(lèi)為例來(lái)介紹:

class Person{
// 屬性
private:
    std::string name;
    std::string address;
    
// 方法
public:
    std::string getName(){
        return name;
    }
    std::string setName(std::string n){
        name = n;
    }
    
    std::string getAddress(){
        return address;
    }
    std::string setAddress(std::string adr){
        address = adr;
    }
}

3.2.1 屬性

類(lèi)的數(shù)據(jù)通過(guò)屬性來(lái)表示,用來(lái)存放該類(lèi)實(shí)例化的每個(gè)對(duì)象的狀態(tài)

屬性可以有3種類(lèi)型:

    public: 其它對(duì)象可以訪問(wèn)private: 只有自身對(duì)象可以訪問(wèn)protected: 只允許相關(guān)對(duì)象訪問(wèn)

3.2.2 方法

方法實(shí)現(xiàn)了一個(gè)類(lèi)需要的行為。

在Person類(lèi)中,方法有g(shù)etName()、getName()、getAddress()、setAddress()。

通過(guò)方法來(lái)檢查或修改對(duì)象的屬性,是面向?qū)ο笾谐S玫募夹g(shù)。

3.2.3 消息

消息是對(duì)象之間的通信機(jī)制。

當(dāng)對(duì)象A調(diào)用了對(duì)象B的一個(gè)方法,則表示對(duì)象A正在向?qū)ο驜發(fā)送一個(gè)消息,對(duì)象B的響應(yīng)即為其返回值。

class Payroll{
    std::string name;
    Person p = new Person();
    p.setName("Joe");
    //...
    name = p.getName();
}

3.3 類(lèi)的可視化描述——UML與類(lèi)圖

統(tǒng)一建模語(yǔ)言UML(Unified Modeling Language)是一種可視化建模工具,其中的UML類(lèi)圖,可以用來(lái)描述類(lèi)的特征。

每個(gè)類(lèi)圖由三部分組成:類(lèi)名、屬性(數(shù)據(jù))和方法(行為)。

類(lèi)圖中:

    加號(hào)(+)表示公有訪問(wèn)減號(hào)(-)表示私有訪問(wèn)井號(hào)(#)表示保護(hù)訪問(wèn)

4 面向?qū)ο蟮奶匦?/h2>

經(jīng)典的面向?qū)ο螅瑩碛腥筇匦裕?a class="article-link" target="_blank" href="/baike/492719.html">封裝(encapsulation)、繼承(inheritance)和多態(tài)(polymorphism)。除此之外,面向?qū)ο筮€會(huì)加入“組合”的特性。

4.1 封裝

封裝是指把對(duì)象的屬性和方法進(jìn)行封裝,對(duì)外隱藏其內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。

使用對(duì)象的好處之一,是無(wú)須對(duì)外暴露其所有的屬性和方法。

一個(gè)好的設(shè)計(jì),是僅暴露出必要的接口來(lái)與其它對(duì)象進(jìn)行交互。

4.1.1 接口與實(shí)現(xiàn)

接口定義了對(duì)象之間的通信方式。實(shí)現(xiàn)是具體功能的實(shí)現(xiàn)過(guò)程。

用戶(hù)通過(guò)類(lèi)的接口與對(duì)象交互時(shí),只需要關(guān)注接口的形式,無(wú)需關(guān)注(也不應(yīng)該看到)對(duì)象的內(nèi)部實(shí)現(xiàn)。

4.1.2 舉例

一個(gè)計(jì)算整數(shù)的平方的例子:

class IntSquare{
// 私有屬性
private:
    int squareValue;
    
// 公共接口
public:
    int getSquare (int value){
        squareValue = calculateSquare(value);
        return squareValue;
    }
    
// 私有實(shí)現(xiàn)
private:
    int calculateSquare(int value){
        return value*value;
    }
}

該類(lèi)中,外部對(duì)象唯一能訪問(wèn)的,就是公共接口getSquare(),其余的私有屬性squareValue以及私有方法calculateSquare,外部對(duì)象無(wú)需知道這些私有屬性和方法的存在。

4.2 繼承

繼承是指一個(gè)類(lèi)可以繼承另一個(gè)類(lèi)的屬性和方法。

可以通過(guò)提取公共屬性和方法來(lái)創(chuàng)建新類(lèi)。

例如:有一個(gè)貓類(lèi)(Cat)和一個(gè)狗類(lèi)(Dog),這兩個(gè)類(lèi)都有一個(gè)屬性可以表示眼睛的顏色。在面向?qū)ο笾?,可以將顏色屬性上移到名為哺乳?dòng)物的類(lèi)中(Mammal)。

4.2.1 超類(lèi)和子類(lèi)

    超類(lèi):也稱(chēng)父類(lèi)、基類(lèi)。它包含了所有子類(lèi)的公共屬性和行為。使用基類(lèi)的好處在于,通過(guò)繼承基類(lèi),減少了大量重復(fù)的工作。子類(lèi):即超類(lèi)的衍生類(lèi),是超類(lèi)的擴(kuò)展

4.2.2 抽象

在實(shí)現(xiàn)了哺乳動(dòng)物類(lèi)和貓、狗類(lèi)后,還可以添加其它哺乳動(dòng)物(老虎、獅子),也可以將貓類(lèi)作為父類(lèi),繼續(xù)擴(kuò)展出不同品種的貓(波斯貓、加菲貓)

4.2.3 is-a關(guān)系

繼承的關(guān)系,也稱(chēng)作is-a關(guān)系,例如,貓is a哺乳動(dòng)物,狗is a哺乳動(dòng)物。

多重繼承:

多數(shù)編程語(yǔ)言中(Java、.Net、Swift),一個(gè)類(lèi)只有一個(gè)父類(lèi),一個(gè)父類(lèi)可以有多個(gè)子類(lèi)但在C++中,一個(gè)類(lèi)可以有多個(gè)父類(lèi),即允許繼承多個(gè)父類(lèi)的功能。

4.3 多態(tài)

多態(tài)與繼承是緊耦合的關(guān)系。

當(dāng)向一個(gè)對(duì)象發(fā)送消息時(shí),該對(duì)象必須定義其實(shí)現(xiàn)來(lái)響應(yīng)消息。

在繼承的關(guān)系中,子類(lèi)從父類(lèi)中繼續(xù)接口,但每個(gè)子列又是各有特點(diǎn)的,因此每個(gè)子類(lèi)各自實(shí)現(xiàn)對(duì)應(yīng)的接口功能,實(shí)現(xiàn)獨(dú)特的應(yīng)答。

4.4 組合

組合,字母理解,多個(gè)對(duì)象,組合為一個(gè)新的對(duì)象,例如,車(chē)架、車(chē)輪、發(fā)動(dòng)機(jī)等對(duì)象組成了汽車(chē)對(duì)象。

4.4.1 抽象

類(lèi)比繼承方式,通過(guò)組合的方式,也是構(gòu)建對(duì)象的一種機(jī)制。實(shí)際上,構(gòu)建 ? 新類(lèi)方式,就是繼承和組合這兩種方式。

使用繼承,是把屬性和方法提取到通用的類(lèi)中。

使用組合,是把類(lèi)嵌入到其它類(lèi)中的來(lái)構(gòu)造新的類(lèi)。

4.4.2 has-a關(guān)系

組合的關(guān)系,也稱(chēng)作has-a關(guān)系,例如,汽車(chē)has a發(fā)動(dòng)機(jī)。

5 總結(jié)

本篇介紹了面向?qū)ο蟮囊恍┗靖拍?,是面向?qū)ο缶幊痰幕A(chǔ)。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶(hù)資源
  • 寫(xiě)文章/發(fā)需求
立即登錄