C++中抽象類別和介面的區別

來源:互聯網
上載者:User

抽象類別(abstract class)和介面(interface)的概念是物件導向設計中常用的概念, 也是比較容易混淆的概念. 在這裡, 我提出一種區分它們的思路:

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

2. 如果一個類B在文法上實現了(implement)介面I, 那麼類B遵從介面I制定的協議.

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

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

而interface的本質是一套協議. 在程式設計的發展中, 人們又發現介面可以用來表示對行為的抽象, 不過, 這隻是interface的一種用法不是其本質.

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

理論結合實際才是最好的學習方式, 不過在這裡, 我只想舉一些我見到過關於介面使用的反面教材:

1. 在介面中包含資料成員. 這幾乎肯定是錯的, 因為協議是規範是標準, 不應該跟具體實現有任何牽連, 也不應該給具體實現造成任何負擔.

2. C++中 delete 掉一個介面. 例如:

class IInterface() 

{

Public:

Virtual ~IInterface(){};

…

}



Class ClassImpl : public IInterface

{

…

}



Int main()

{

IInterface* pInterface = new ClassImpl();

…

delete pInterface;

}

從文法的角度和語言自身的角度來看, 這是可行的, 而且只要將介面的解構函式設定為virtual, 就能避免記憶體流失.

但我要說, 這不是文法和語言的問題, 而是從根本上就錯了.

因為介面是一套協議, 一套規範, 並不是實現.

Delete 一個介面的代碼, 到底想要表達什麼樣的語義? 如果一段代碼從語義上都說不通, 就不應該出現在程式中.

------------------------------------------------------------------------------------------------------------------------
要在C++中表現介面的概念, 一種做法是這樣:

class IInterface 

{

public:

virtual void DoSomething() = 0;
// 不應當有解構函式, 因為從語義上說, 介面是不能delete的. 

}

如果要delete, 只能delete一個類的執行個體:

Class A 

{

Public:

Virtual ~A();



Public:

Virtual void DoSomething() = 0;

}

Class B : public A

{

…

}

Int main()

{

A* pA = new B();

…

Delete pA;

}

我們可以這樣做, 因為pA對應的是一個執行個體, 我們可以在A這一層將其銷毀.

先舉個例子,方便大家理解,然後從例子中抽象概括出結理論。

  比如,一家生產門的公司,需要先定義好門的模板,以便能快速生產出各種規格的門。
這裡的模板通常會有兩類模板:抽象類別模板和介面模板。
抽象類別模板:這個模板裡面應該包含所有門都應該具有的共同屬性(如,門的形狀和顏色等)和共同行為(如,開門和關門)。
介面模板:有些門可能需要具有警示和指紋識別等功能,但這些功能又不是所有門必須具有的,所以像這樣的行為應該放在單獨的介面中。

有了上面的兩類模板,以後生產門就很方便了:利用抽象類別模板和包含了警示功能的介面模板就能生產具有警示功能的門了。同理,利用抽象類別模板和包含了指紋識別功能的介面模板就能生產具有指紋識別功能的門了。

總之:抽象類別用來抽象自然界一些具有相似性質和行為的對象。而介面用來抽象行為的標準和規範,用來告訴介面的實現者必要按照某種規範去完成某個功能。

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

本文來自網路資源:http://www.cnblogs.com/lingshaohu/archive/2011/12/06/2278437.html

//

介面:沒有任何成員變數,全部是純虛函數,只定義了行為。

抽象類別:有純虛函數的類,不能被執行個體化的類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.