簡體   English   中英

何時使用抽象類是有意義的

[英]When does it make sense to use an abstract class

我正在從c轉換到c ++,當然,OOP比預期的要困難得多。 困難在於不了解類和繼承的核心機制,而是如何使用它。 我讀過關於設計模式的書,但他們只展示了這些技術,並描繪了為什么應該使用這些技術的模糊圖片。 我真的很難找到抽象類的用途。 以下面的代碼為例。

class baseClass {
public:
    virtual void func1() = 0;
    virtual void func2() = 0;
};
class inhClass1 : baseClass {
public:
    void func1();
    void func2();
};
class inhClass2 : baseClass{
public:
    void func1();
    void func2();
};
int main() {}

我經常在設計書中看到這樣設置的抽象類。 我知道通過這種配置,繼承的類可以訪問基類的公共成員。 我知道虛函數是繼承類的占位符。 問題是我仍然不明白這是如何有用的。 我試圖將它與重載函數進行比較,我只是沒有看到實際用途。

我真正想要的是讓某個人能夠用最簡單的例子來說明為什么抽象類實際上是有用的並且是一種情況的最佳解決方案。 別誤會我的意思。 我不是說沒有一個好的答案。 我只是不明白如何正確使用它們。

抽象類和接口都允許您定義子類應實現的方法簽名:名稱,參數,異常和返回類型。

如果存在合理的抽象類,則可以提供默認實現。 這意味着子類不必實現這樣的方法; 如果他們選擇,他們可以使用默認實現。

接口沒有這樣的選項。 實現接口的類需要實現其所有方法。

在Java中,區別很明顯,因為該語言包含關鍵字interface

C ++接口是具有所有virtual方法和純虛擬析構函數的類。

當您想要將接口與實現分離時,將使用抽象類和接口。 當您知道有多個實現可供選擇時,或者當您編寫允許客戶端插入自己的實現的框架時,它們非常有用。 該界面提供了客戶期望遵守的合同。

抽象類的一個用途是能夠在對代碼進行最小更改的情況下在不同的具體實現之間輕松切換。 您可以通過向基類類型聲明引用變量來完成此操作。 派生類的唯一提及是在創建期間。 所有其他代碼都使用基類引用。

抽象類用於提供要實現隱藏細節的某些概念的抽象表示。

例如,假設我要實現文件系統接口: -

在抽象層面我能想到什么?

class FileSystemInterface
{
    virtual void openFile();
    virtual void closeFile();
    virtual void readFile();
    virtual void writeFile();
};

在這個時候,我沒有考慮任何具體的事情,比如它們將如何在Windows或Linux中處理,而是我專注於一些抽象的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM