2022年3月17日 星期四

[C++ / C# ] 抽象類別宣告變數? - 應用在C++與C#的小差異

在C#裡,當我們使用工廠模式把實作類別隱藏起來,

統一使用父類別當容器時,通常就是宣告父類別變數,

再new出子類別物件指派給父類別變數就好,

但是在C++中由於有指標的關係,需特別注意宣告的格式。

舉個例子,我現在要建構一個和硬體溝通的介面給上層使用,名叫HWHandshake,

實作這個介面可以使用不同的library來完成,可以透過兩個市售軟體VISA或Jungo來實現,

架構如下所示:

於是在程式碼中我們會在HWHandshake宣告AbstractIO型別的變數hsObj,

用來裝VISAIO或JungoIO的實體,如下:

奇怪了,宣告變數而已,為什麼會有問題呢?

這是因為C++中宣告物件實體有兩種方式,

一種是透過類別名稱直接宣告的物件

生命週期只存在前後大括號中,記憶體存放在stack中,系統會在不需使用時自動清除,

一種是透過new建立實體並指派給指標變數的動態物件

生命週期必須自己掌控,記憶體則存在於heap中,使用delete時才會清除。


而抽象類別是不能實體化的,也就是不能生成物件,

因此直接用抽象類別宣告變數,就等同想建立抽象類別的物件(實體化),

這是不被允許的。

既然知道原因,就知道該怎麼解決問題了,

因為我想實體化的是子類別,但想用抽象類別變數指向子類別實體物件,

那就是把抽象類別宣告成指標,去指向子類別的實體物件就好囉。

那實際工廠方法怎麼實做呢?

來看HWHandshake的建構子。

宣告:

實作:

加上策略模式的概念,讓切換底層類別時能夠只改變參數就達成。

這樣使用HWHandshake的使用者,

就不需要知道抽象類別(AbstractIO)與實際實作的類別(VISA、Jungo)有哪些,

只需要知道HWHandshake類別與他能提供的實作方式(IOToolType內所定義的)有哪幾種,

就可以操作硬體IO了,且切換快速!


參考資料:Simple Factory Pattern 簡單工廠模式 與 Strategy Pattern 策略模式 使用方式

參考資料:Stack 與 Heap 有何差別

沒有留言:

張貼留言

社會新鮮人如何投資?

我的觀點是,在 沒有很多 本錢 的情況下, 別寄望每個月幾千元放到股票或者最近很夯的高股息ETF就能讓你致富, 先投資自己,讓自己的本業收入提高吧。