2014-10-30 87 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