注入vs.继承
Injection vs. Inheritance
我有一个类,从文件中读取一些数据,然后解码该数据。
我试图做类尽可能泛型,即我希望它能够解码任何类型的数据。
解码器本身是一个通用接口。
我看到两个选项:
-
注入-在构造函数
中获得正确的解码器作为参数MyReader (Decoder
解码器){ -
继承-提供一个虚拟方法,将返回正确的解码器
MyReader ();虚拟Decoder
GetDecoder () = 0; 我的类的用户只需要继承这个类并只实现"GetDecoder"。
注入解决方案可以帮助您减少使用的类的数量,同时让用户了解特定的编码器。
继承将需要许多类,但封装了编码器的使用。
什么被认为是更好的方法?
我猜你的"注射";方法将通过公共基类存储解码器,并且您正在考虑的替代方案更像是:
MyReader(AbstractDecoder& decoder) : _decoder(decoder) { };
MyReader() { private: virtual Decoder<T>& GetDecoder() = 0; };
有几个注意事项:
注入意味着客户端代码在创建和指定
Decoder
以及处理其生命周期中可能发生的错误方面必须发挥更积极的作用,而继承则隐含在派生类的选择中,并且错误处理可以与MyReader
错误更统一;- 注入,有一点更多的客户端意识在理解
Decoder
是否被构造函数复制(如你所做的),或者调用者需要确保生命周期大于读者,是否相同的解码器可以传递给多个MyReader
构造函数等方面是必要的。-所有的有点混乱和容易出错
- 注入,有一点更多的客户端意识在理解
注入意味着
MyReader
API可能允许在读取器的生命周期内指定另一个解码器与继承,你最终有更多的类和客户端代码需要小心一点,以避免切片,而与注入它的
MyReader
本身,需要在存储/复制时有点小心,但至少这是集中的,因此更容易获得和保持正确的
CRTP是另一种选择,具有编译时分辨率和优化(死代码消除,内联等)。
相关文章:
- 继承函数的重载解析
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么在保护模式下继承升级不起作用
- 数据成员SFINAE的C++17测试:gcc vs clang
- 通过继承类使用来自不同命名空间的运算符
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- 在继承多个空类时,了解GCC/Clang vs MSVC2015之间的不同填充规则
- C 多重继承和向上的智能指针破坏会导致VS 2017中的堆腐败
- 使用VS公共继承模板化
- 继承自 std::true_type vs static constexpr const bool 成员
- 最佳继承层次结构,例如:Model3D -> ModelAnimation VS ModelAnimation or Model3D -> ModelAnimation
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- 私有继承vs暴露迭代器
- 多态性vs常规继承
- 注入vs.继承
- visual c++在vs 2010中出现了模糊继承错误
- 继承vs类模板专门化.设计的家伙