我需要建模一个服务检索器类来检索各种服务。从基指针集合中投射到子类
假设您有一组服务,每个服务可以用唯一的字符串键 (例如: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