2014-10-30 93 views
0

我需要建模一個服務檢索器類來檢索各種服務。從基指針集合中投射到子類

假設您有一組服務,每個服務可以用唯一的字符串鍵 (例如:Services.getService("render");應檢索索引爲「render」的服務)檢索到。 現在,Service是各種* Service繼承類的基類,如RenderService,InputService等。 ,每個人都有不同的方法。

現在,這可以簡單地用std::unordered_map<std::string, Service*>建模,但它返回一個指向基類而不是派生類的指針(到目前爲止,這很明顯)。這意味着我不能自動調用所請求的服務的方法而不進行明確的演員表演,我必須寫下如下內容:((RenderService*)Services.at("render"))->callRenderServiceMethod();。 這是相當醜陋和多餘的,因爲at方法鍵邏輯鏈接到RenderService

我可以通過聲明裙解決該問題:

#define CALL_RENDER ((RenderService*)Services.at("render"))

,並用它作爲

CALL_RENDER->callRenderServiceMethod();

雖然它看起來像一個聰明的「黑客」,這是不正確的做法解決這個問題。

我也試過做類似getService<RenderService>("render");的東西,但它不能很好地工作,冗餘問題仍然存在。

最後,我這樣做是因爲我想避免這種情況: class Services { public: RenderService& getRenderService(); AudioService& getAudioService(); AnotherInheritedService& getAnotherInheritedService(); private: RenderService _renderService; AudioService _audioService; AnotherInheritedService _anotherInheritedService; };

我應該用什麼樣的方式對此類問題?

+0

我不確定這是否是您應該使用的方法,但您可以做的一件事就是使用模板方法,使用GetService (void)方法,該方法在內部使用開關來返回相應的實例。 – Ian 2014-10-30 12:55:15

回答

1

從我所瞭解的問題中,您需要將函數聲明爲virtual functions

在基類定義中聲明虛函數並在每個派生類中實現該函數將允許根據類指針的類型調用適當的類函數。

現在,我不明白爲什麼你只有指向基類的指針。從邏輯上講,你從unordered_map得到的指針應該是實際派生的類指針,但只能「上傳」到基類指針。

+0

我不認爲我應該在這種情況下使用虛函數,因爲繼承的服務類在它們之間沒有共同的接口。 另外,我有指向基類的指針,因爲我想使服務類儘可能具有可擴展性(例如:如果我想插入新服務,我應該將一個新服務放在'unordered_map'集合中,然後通過名稱)。 – 2014-10-31 09:00:23