西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)VC|VC++ → C++中抽象類和接口的區(qū)別 你知道多少?

C++中抽象類和接口的區(qū)別 你知道多少?

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2011/4/30 22:23:02字體大。A-A+

作者:西西點(diǎn)擊:995次評(píng)論:0次標(biāo)簽: 接口

  • 類型:編程輔助大。1.4M語言:英文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

 抽象類(abstract class)和接口(interface)的概念是面向?qū)ο笤O(shè)計(jì)中常用的概念, 也是比較容易混淆的概念. 在這里, 我提出一種區(qū)分它們的思路:

1. 如果一個(gè)類B在語法上繼承(extend)了類A, 那么在語義上類B是一個(gè)類A.

2. 如果一個(gè)類B在語法上實(shí)現(xiàn)了(implement)接口I, 那么類B遵從接口I制定的協(xié)議.

------------------------------------------------------------------------------------------------

使用abstract class的根本原因在于, 人們希望通過這樣的方式, 表現(xiàn)不同層次的抽象.

而interface的本質(zhì)是一套協(xié)議. 在程序設(shè)計(jì)的發(fā)展中, 人們又發(fā)現(xiàn)接口可以用來表示對(duì)行為的抽象, 不過, 這只是interface的一種用法不是其本質(zhì).

------------------------------------------------------------------------------------------------

理論結(jié)合實(shí)際才是最好的學(xué)習(xí)方式, 不過在這里, 我只想舉一些我見到過關(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è)接口. 例如:

class IInterface()

{

Public:

Virtual ~IInterface(){};



}



Class ClassImpl : public IInterface

{



}



Int main()

{

IInterface* pInterface = new ClassImpl();



delete pInterface;

}

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

要在C++中表現(xiàn)接口的概念, 一種做法是這樣:


class IInterface

{

public:

virtual void DoSomething() = 0;

}



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


如果要delete, 只能delete一個(gè)類的實(shí)例:

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這一層將其銷毀.

先舉個(gè)例子,方便大家理解,然后從例子中抽象概括出結(jié)理論。

比如,一家生產(chǎn)門的公司,需要先定義好門的模板,以便能快速生產(chǎn)出各種規(guī)格的門。
這里的模板通常會(huì)有兩類模板:抽象類模板和接口模板。
抽象類模板:這個(gè)模板里面應(yīng)該包含所有門都應(yīng)該具有的共同屬性(如,門的形狀和顏色等)和共同行為(如,開門和關(guān)門)。
接口模板:有些門可能需要具有報(bào)警和指紋識(shí)別等功能,但這些功能又不是所有門必須具有的,所以像這樣的行為應(yīng)該放在單獨(dú)的接口中。
有了上面的兩類模板,以后生產(chǎn)門就很方便了:利用抽象類模板和包含了報(bào)警功能的接口模板就能生產(chǎn)具有報(bào)警功能的門了。同理,利用抽象類模板和包含了指紋識(shí)別功能的接口模板就能生產(chǎn)具有指紋識(shí)別功能的門了。

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

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

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)