国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中抽象類是什么?和接口有啥區別

2020-02-24 14:37:02
字體:
來源:轉載
供稿:網友

C++中抽象類是什么?和接口有啥區別?抽象類(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這一層將其銷毀.
先舉個例子,方便大家理解,然后從例子中抽象概括出結理論。

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

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

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

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

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

這是我自己的看法,歡迎大家和我探討這個問題,更多精彩內容,盡在武林技術頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南阳市| 且末县| 淮南市| 万盛区| 阳谷县| 郧西县| 沂南县| 莎车县| 西华县| 石台县| 响水县| 页游| 丹寨县| 安宁市| 安远县| 长海县| 泽州县| 泗阳县| 拉萨市| 万山特区| 新兴县| 汕尾市| 绥宁县| 安远县| 昆山市| 宁晋县| 岗巴县| 南京市| 花莲县| 深圳市| 高安市| 锡林郭勒盟| 肃南| 喀喇| 东至县| 千阳县| 扎兰屯市| 攀枝花市| 丰顺县| 志丹县| 广灵县|