【发布时间】:2026-02-23 10:20:02
【问题描述】:
我需要建模一个服务检索器类来检索各种服务。
假设您有一个服务集合,每个服务都可以使用唯一的字符串键检索
(例如: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();
虽然它看起来像一个聪明的“hack”,但这并不是解决这个问题的正确方法。
我也尝试过getService<RenderService>("render"); 之类的操作,但效果不佳,冗余问题仍然存在。
最后,我这样做是因为我想避免这种情况:
class Services
{
public:
RenderService& getRenderService();
AudioService& getAudioService();
AnotherInheritedService& getAnotherInheritedService();
private:
RenderService _renderService;
AudioService _audioService;
AnotherInheritedService _anotherInheritedService;
};
我应该用什么样的方法来解决这种问题?
【问题讨论】:
-
我不确定这是否是您“应该”使用的方法,但您可以做的一件事是使用模板方法,使用 GetService
(void) 方法,该方法使用在内部切换以返回适当的实例。
标签: c++ inheritance design-patterns casting