我需要建模一個服務檢索器類來檢索各種服務。從基指針集合中投射到子類
假設您有一組服務,每個服務可以用唯一的字符串鍵 (例如: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; };
我應該用什麼樣的方式對此類問題?
我不確定這是否是您應該使用的方法,但您可以做的一件事就是使用模板方法,使用GetService(void)方法,該方法在內部使用開關來返回相應的實例。 –
Ian
2014-10-30 12:55:15