最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

}

Class ClassImpl : public IInterface
{

}

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

delete pInterface;
}


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

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

// 不應(yīng)當(dāng)有析構(gòu)函數(shù), 因為從語義上說, 接口是不能delete的.


如果要delete, 只能delete一個類的實例:
復(fù)制代碼 代碼如下:

Class A
{
Public:
Virtual ~A();

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

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

Delete pA;
}


我們可以這樣做, 因為pA對應(yīng)的是一個實例, 我們可以在A這一層將其銷毀.
先舉個例子,方便大家理解,然后從例子中抽象概括出結(jié)理論。

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

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

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

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

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

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

相關(guān)文章

  • C語言實現(xiàn)靜態(tài)順序表的實例詳解

    C語言實現(xiàn)靜態(tài)順序表的實例詳解

    這篇文章主要介紹了C語言實現(xiàn)靜態(tài)順序表的實例詳解的相關(guān)資料,這里提供是幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 利用C語言模擬實現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)

    利用C語言模擬實現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何通過C語言模擬實現(xiàn)qsort(采用冒泡的方式),strcpy,strcat,strcmp等函數(shù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-11-11
  • C++設(shè)計模式之策略模式(Strategy)

    C++設(shè)計模式之策略模式(Strategy)

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計模式之策略模式Strategy ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Cocos2d-x學(xué)習(xí)入門之HelloWorld程序

    Cocos2d-x學(xué)習(xí)入門之HelloWorld程序

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)入門之HelloWorld程序,是學(xué)習(xí)Cocos2d-x的入門程序,其重要性不言而喻,需要的朋友可以參考下
    2014-08-08
  • C語言詳細(xì)分析講解struct與union使用方法

    C語言詳細(xì)分析講解struct與union使用方法

    最近開始自學(xué)C語言,從最基礎(chǔ)部分的開始學(xué)起。今天看書的時候注意到了struct和union似乎很像,除了名字不同,看起來幾乎沒有區(qū)別。<BR>既然C中定義了struct和union兩個關(guān)鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來總結(jié)一下他們的使用
    2022-04-04
  • 最新評論

    阳城县| 文水县| 扶风县| 南安市| 凤台县| 舞阳县| 新安县| 富蕴县| 扬中市| 娱乐| 康平县| 东乌珠穆沁旗| 高阳县| 手游| 青龙| 明星| 日土县| 荥阳市| 庄河市| 雷波县| 安阳县| 于田县| 澄江县| 漳平市| 车险| 兴业县| 鹤岗市| 蒙自县| 准格尔旗| 阿克苏市| 丁青县| 鄱阳县| 潮州市| 金坛市| 信阳市| 北川| 绵竹市| 沙湾县| 阜新| 陵川县| 延庆县|