进行依赖项注入时公开私有方法

时间:2019-02-07 09:38:25

标签: c++ templates dependency-injection

我有一个模板类'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();
}

1 个答案:

答案 0 :(得分:4)

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

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

现在,任何Foo实例都能够调用Bar的私有成员函数。代码可以编译,但是您仍然可以考虑这样做是否值得克服这些缺点:正如@StoryTeller在评论中指出的,friend类不仅是非常强的耦合,而且还保证了对 any 数据的访问。由于某种原因而可能是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