c++ - 进行依赖注入时暴露私有方法
问题描述
我有一个模板类“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 在评论中指出的那样,朋友类不仅是一个非常强的耦合,它保证访问任何可能的数据成员和成员函数private
或protected
出于某种原因。换句话说,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
推荐阅读
- python - 将numpy数组写入VTK文件
- android - Flutter Doctor: Flutter and dart plugin not installed error, but plugins are installed (WINDOWS)
- ruby - 在ruby中将字符串转换为哈希
- javascript - React 仅触发数组中的一个元素
- information-retrieval - 相关模型
- c++ - 警告:语法规则无用(Bison/Yacc)
- javascript - 正则表达式:如何选择两个标题之间的所有内容?
- c++ - c++ 移动后重新分配
- c# - 没有 csproj 的 C# 9 顶级程序?
- kotlin - MVVM 存储库