首页 > 解决方案 > 进行依赖注入时暴露私有方法

问题描述

我有一个模板类“Foo”和另一个非模板类“Bar”。我想在 Foo 中有 Bar 的实例,并公开 Bar 的一个仅对 Foo 私有的函数。

例子:

template <typename T>
class Foo
{
    std::shared_ptr<Bar> m_bar;
    bool Func()
    {
        return m_bar->DoSomething();
    }
}

class Bar
{
private:
    bool DoSomething();
}

标签: c++templatesdependency-injection

解决方案


您可以将Foo模板声明为的朋友Bar

class Bar
{
    template <class T> friend class Foo;
    // same as before...
};

现在,任何Foo实例化都可以调用Bar. 代码可以编译,但你仍然可以考虑这是否值得缺点:正如@StoryTeller 在评论中指出的那样,朋友类不仅是一个非常强的耦合,它保证访问任何可能的数据成员和成员函数privateprotected出于某种原因。换句话说,friend类确实违反了封装,并且应该有强烈的论据来支持使用这种方案。

但是请注意,您并没有真正注入Bar. 注入从外部发生,例如通过将Bar实例传递给 的构造函数Foo,和/或通过Foo使用Bar模板参数进行实例化。在你的情况下,这可能是

template <typename T>
class Foo
{
    std::shared_ptr<T> m_bar;
    // same as before...
};

Foo<Bar> instance;
//  ^^^ inject dependency on Bar

推荐阅读