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

Expose private method when doing dependency injection

本文关键字:有方法 注入 依赖      更新时间:2023-10-16

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

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

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

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

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

template <typename T>
class Foo
{
    std::shared_ptr<T> m_bar;
    // same as before...
};
Foo<Bar> instance;
//  ^^^ inject dependency on Bar