欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中抽象類(lèi)和接口的區(qū)別介紹

 更新時(shí)間:2013年04月11日 10:14:17   作者:  
抽象類(lèi)(abstract class)和接口(interface)的概念是面向?qū)ο笤O(shè)計(jì)中常用的概念, 也是比較容易混淆的概念. 在這里, 我提出一種區(qū)分它們的思路

1. 如果一個(gè)類(lèi)B在語(yǔ)法上繼承(extend)了類(lèi)A, 那么在語(yǔ)義上類(lèi)B是一個(gè)類(lèi)A.
2. 如果一個(gè)類(lèi)B在語(yǔ)法上實(shí)現(xiàn)了(implement)接口I, 那么類(lèi)B遵從接口I制定的協(xié)議.

使用abstract class的根本原因在于, 人們希望通過(guò)這樣的方式, 表現(xiàn)不同層次的抽象.
而interface的本質(zhì)是一套協(xié)議. 在程序設(shè)計(jì)的發(fā)展中, 人們又發(fā)現(xiàn)接口可以用來(lái)表示對(duì)行為的抽象, 不過(guò), 這只是interface的一種用法不是其本質(zhì).

理論結(jié)合實(shí)際才是最好的學(xué)習(xí)方式, 不過(guò)在這里, 我只想舉一些我見(jiàn)到過(guò)關(guān)于接口使用的反面教材:

1. 在接口中包含數(shù)據(jù)成員. 這幾乎肯定是錯(cuò)的, 因?yàn)閰f(xié)議是規(guī)范是標(biāo)準(zhǔn), 不應(yīng)該跟具體實(shí)現(xiàn)有任何牽連, 也不應(yīng)該給具體實(shí)現(xiàn)造成任何負(fù)擔(dān).
2. C++中 delete 掉一個(gè)接口. 例如:

復(fù)制代碼 代碼如下:

class IInterface()
{
Public:
Virtual ~IInterface(){};

}

Class ClassImpl : public IInterface
{

}

Int main()
{
IInterface* pInterface = new ClassImpl();

delete pInterface;
}


從語(yǔ)法的角度和語(yǔ)言自身的角度來(lái)看, 這是可行的, 而且只要將接口的析構(gòu)函數(shù)設(shè)置為virtual, 就能避免內(nèi)存泄漏. 但我要說(shuō), 這不是語(yǔ)法和語(yǔ)言的問(wèn)題, 而是從根本上就錯(cuò)了. 因?yàn)榻涌谑且惶讌f(xié)議, 一套規(guī)范, 并不是實(shí)現(xiàn). Delete 一個(gè)接口的代碼, 到底想要表達(dá)什么樣的語(yǔ)義? 如果一段代碼從語(yǔ)義上都說(shuō)不通, 就不應(yīng)該出現(xiàn)在程序中.
要在C++中表現(xiàn)接口的概念, 一種做法是這樣:
復(fù)制代碼 代碼如下:

class IInterface
{
public:
virtual void DoSomething() = 0;
}

// 不應(yīng)當(dāng)有析構(gòu)函數(shù), 因?yàn)閺恼Z(yǔ)義上說(shuō), 接口是不能delete的.


如果要delete, 只能delete一個(gè)類(lèi)的實(shí)例:
復(fù)制代碼 代碼如下:

Class A
{
Public:
Virtual ~A();

Public:
Virtual void DoSomething() = 0;
}
Class B : public A
{

}
Int main()
{
A* pA = new B();

Delete pA;
}


我們可以這樣做, 因?yàn)閜A對(duì)應(yīng)的是一個(gè)實(shí)例, 我們可以在A(yíng)這一層將其銷(xiāo)毀.
先舉個(gè)例子,方便大家理解,然后從例子中抽象概括出結(jié)理論。

比如,一家生產(chǎn)門(mén)的公司,需要先定義好門(mén)的模板,以便能快速生產(chǎn)出各種規(guī)格的門(mén)。
這里的模板通常會(huì)有兩類(lèi)模板:抽象類(lèi)模板和接口模板。

抽象類(lèi)模板:這個(gè)模板里面應(yīng)該包含所有門(mén)都應(yīng)該具有的共同屬性(如,門(mén)的形狀和顏色等)和共同行為(如,開(kāi)門(mén)和關(guān)門(mén))。

接口模板:有些門(mén)可能需要具有報(bào)警和指紋識(shí)別等功能,但這些功能又不是所有門(mén)必須具有的,所以像這樣的行為應(yīng)該放在單獨(dú)的接口中。

有了上面的兩類(lèi)模板,以后生產(chǎn)門(mén)就很方便了:利用抽象類(lèi)模板和包含了報(bào)警功能的接口模板就能生產(chǎn)具有報(bào)警功能的門(mén)了。同理,利用抽象類(lèi)模板和包含了指紋識(shí)別功能的接口模板就能生產(chǎn)具有指紋識(shí)別功能的門(mén)了。

總之:抽象類(lèi)用來(lái)抽象自然界一些具有相似性質(zhì)和行為的對(duì)象。而接口用來(lái)抽象行為的標(biāo)準(zhǔn)和規(guī)范,用來(lái)告訴接口的實(shí)現(xiàn)者必要按照某種規(guī)范去完成某個(gè)功能。

這是我自己的看法,歡迎大家和我探討這個(gè)問(wèn)題。

相關(guān)文章

  • C++中mutable與volatile的深入理解

    C++中mutable與volatile的深入理解

    這篇文章主要給的阿加介紹了關(guān)于C++中mutable與volatile的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • VSCode遠(yuǎn)程開(kāi)發(fā)調(diào)試服務(wù)器c/c++代碼

    VSCode遠(yuǎn)程開(kāi)發(fā)調(diào)試服務(wù)器c/c++代碼

    語(yǔ)音相關(guān)的好多項(xiàng)目要在linux上跑,但代碼開(kāi)發(fā)大多是在PC機(jī)上,本篇簡(jiǎn)單介紹一下怎么在個(gè)人電腦上用VSCode遠(yuǎn)程開(kāi)發(fā)調(diào)試服務(wù)器上的c/c++代碼。感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • C語(yǔ)言實(shí)現(xiàn)數(shù)字炸彈小游戲

    C語(yǔ)言實(shí)現(xiàn)數(shù)字炸彈小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)數(shù)字炸彈小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++ Futures與Promises線(xiàn)程使用示例講解

    C++ Futures與Promises線(xiàn)程使用示例講解

    future和promise的作用是在不同線(xiàn)程之間傳遞數(shù)據(jù)。使用指針也可以完成數(shù)據(jù)的傳遞,但是指針?lè)浅NkU(xiǎn),因?yàn)榛コ饬坎荒茏柚怪羔樀脑L(fǎng)問(wèn);而且指針的方式傳遞的數(shù)據(jù)是固定的,如果更改數(shù)據(jù)類(lèi)型,那么還需要更改有關(guān)的接口,比較麻煩
    2022-11-11
  • c++大數(shù)階乘的實(shí)現(xiàn)方法

    c++大數(shù)階乘的實(shí)現(xiàn)方法

    本篇文章對(duì)c++的大數(shù)階乘進(jìn)行了代碼示例的介紹。需要的朋友參考下
    2013-05-05
  • Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Valgrind是一款基于模擬linux下的程序調(diào)試器和剖析器的軟件套件,可以運(yùn)行于x86, amd64和ppc32架構(gòu)上。valgrind包含一個(gè)核心,它提供一個(gè)虛擬的CPU運(yùn)行程序,還有一系列的工具,它們完成調(diào)試,剖析和一些類(lèi)似的任務(wù)
    2014-01-01
  • 聊聊C++ 運(yùn)算符重載知識(shí)

    聊聊C++ 運(yùn)算符重載知識(shí)

    運(yùn)算符重載是一種形式的C++多態(tài),重載運(yùn)算符可以使代碼看起來(lái)更加自然,下面通過(guò)例子介紹下C++ 運(yùn)算符重載知識(shí),感興趣的朋友一起看看吧
    2021-11-11
  • C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲

    C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別

    C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別

    函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2022-08-08
  • C語(yǔ)言中實(shí)現(xiàn)itoa函數(shù)的實(shí)例

    C語(yǔ)言中實(shí)現(xiàn)itoa函數(shù)的實(shí)例

    這篇文章主要介紹了C語(yǔ)言中實(shí)現(xiàn)itoa函數(shù)的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10

最新評(píng)論