首先,我不得不提及,我已經在stackoverflow上閱讀了許多C++虛擬問題。我有一些知識他們是如何工作的,但是當我開始這個項目並嘗試設計一些我從不考慮/使用虛擬或純虛擬實現的東西時。也許是因爲我缺乏知識,他們是如何工作的,或者我不知道如何與他們一起實現某些東西。我認爲這很糟糕,因爲我沒有完全使用面向對象的開發。使用(純)虛擬C++設計
也許有人可以告訴我如何適應他們?
首先,我不得不提及,我已經在stackoverflow上閱讀了許多C++虛擬問題。我有一些知識他們是如何工作的,但是當我開始這個項目並嘗試設計一些我從不考慮/使用虛擬或純虛擬實現的東西時。也許是因爲我缺乏知識,他們是如何工作的,或者我不知道如何與他們一起實現某些東西。我認爲這很糟糕,因爲我沒有完全使用面向對象的開發。使用(純)虛擬C++設計
也許有人可以告訴我如何適應他們?
查看Java或C#中的抽象基類和接口,以瞭解何時純虛擬有用。
虛擬功能對於面向對象來說非常基礎。 Theree有很多書可以幫助你。我自己,我喜歡Larman的Applying UML and Patterns。
但是當我開始項目,並嘗試設計一些東西,我從來沒有考慮/使用虛擬或純虛擬實現。
這裏的東西,你可以嘗試:
Circle
is-aShape
類型的關係?virtual
功能但是不要爲了使用它們而強制使用層次結構。我最近一直在研究的實際代碼的一個例子:
class Codec {
public:
virtual GUID Guid() { return GUID_NULL; }
};
class JpegEncoder : public Codec {
public:
virtual GUID Guid() { return GUID_JpegEncoder; }
};
class PngDecoder : public Codec {
public:
virtual GUID Guid() { return GUID_PngDecoder; }
};
你不必使用它們,但它們有其優點。
通常它們被用作兩種不同類型的功能之間的「接口」,這兩種功能在代碼方面並不相關。
一個例子是處理文件加載。一個簡單的文件處理類似乎是完美的。然而,在稍後階段,系統會要求您將所有文件轉換爲單個打包文件,同時保持對單個文件的支持以進行調試。你如何處理這裏的加載?很明顯,事情處理方式會有所不同,因爲突然間你不能只打開一個文件。相反,您需要能夠查找文件位置,然後在正常情況下加載之前尋找該位置。
顯而易見的事情是實現一個抽象基類。也許稱之爲BaseFile。 OpenFile函數處理將根據您是使用PackageFile還是DiskFile類而有所不同。所以做一個純粹的虛擬。
然後,當你獲得了PackageFile和磁盤文件類您提供用於打開文件的相應的執行。
可以再加入一些諸如
#if !defined(DISK_FILE) && defined (_DEBUG)
#define DISK_FILE 1
#elif !defined(DISK_FILE)
#define DISK_FILE 0
#endif
#if DISK_FILE
typedef DiskFile File;
#else
typedef PackageFile File;
#endif
現在你只需使用「文件」的typedef做的所有的文件處理。同樣,如果您沒有將DISK_FILE預定義爲0或1,並且調試已設置,它將自動從磁盤加載,否則將從Package文件加載。
當然,這樣的構造仍然允許您在調試程序包文件加載簡單地定義DISK_FILE要提前1它還允許您通過設置DISK_FILE使用0
在發佈版本的磁盤訪問我沒有很多時間ATM,但這裏有一個簡單的例子。
在我的工作,我維護和應用進行對話的各種硬件設備。在這些裝置中,許多電動機用於各種目的。現在,我不知道您是否使用電機和驅動器進行過任何開發,但它們都有些不同,即使它們聲稱遵循像CANOpen這樣的標準。無論如何,當您切換供應商時,您需要創建一些新代碼,也許您的電機或驅動器已達到使用壽命等。此外,此代碼必須與舊設備保持兼容,並且我們也有各種類似設備的型號。所以,總而言之,你必須處理許多不同的電動機和接口。
現在,在我的代碼使用抽象類,命名爲「IMOTOR」,其中只包含純虛函數。在實現代碼中,只有iMotor類被引用。我爲具有不同實現的不同類型的電機創建了一個dll,但它們都實現了iMotor接口。所以,我所需要做的添加/更換電機的工作就是創建一個新的實現,並將該DLL取代舊的。由於它使用這些運動的實現只涉及與IMOTOR接口它永遠不會需要改變,只有每個電機如何做它做什麼需要改變的執行代碼。
如果谷歌的設計模式,如「策略模式」和「命令模式」,你會發現的接口與多態一些很好的用途。除此之外,設計模式總是非常有用。
@Goz:-1:你開始不夠好談一個抽象基類,但你通過使用預處理器搞砸了!你應該忽略在Package和Disk之間進行選擇的解釋,或者繼續使用工廠,以至於很少有代碼知道它們,但只知道抽象基類。 – quamrana 2009-10-29 15:23:23