[英]Injection vs. Inheritance
我有一个类,它从文件中读取一些数据,然后将其解码。
我正在尝试使类尽可能通用,即我希望它能够解码任何类型的数据。
解码器本身是一个通用接口。
我看到2个选项:
注入-在构造函数中获取正确的解码器作为参数
MyReader(Decoder <T>解码器){_decoder =解码器}
继承-提供将返回正确解码器的虚拟方法
MyReader(); 虚拟Decoder <T> GetDecoder()= 0;
我这个类的用户只需要继承该类并仅实现“ GetDecoder”即可。
注入解决方案可帮助您减少使用的类数,同时使用户了解特定的编码器。
继承将需要许多类,但是封装了编码器的用法。
什么被认为是更好的方法?
我假设您的“注入”方法将通过一个公共基类存储解码器,并且您考虑的替代方案更像是:
MyReader(AbstractDecoder& decoder) : _decoder(decoder) { };
MyReader() { private: virtual Decoder<T>& GetDecoder() = 0; };
有一些注意事项:
注入意味着客户端代码必须在创建和指定Decoder
以及处理在其生命周期中可能发生的错误中扮演更积极的角色,而通过继承,它隐含在派生类的选择中,并且可以使用MyReader
更加统一错误处理错误;
Decoder
是由构造函数复制(如您所完成的)还是调用方需要确保生存期长于读取程序的生存期(是否可以使用同一个解码器)方面,需要更多的客户端意识。传递给多个MyReader
构造函数等MyReader
更加混乱和容易出错 注入意味着MyReader
API可以潜在地允许在阅读器的生命周期内指定另一个解码器
通过继承,您最终会有更多的类,并且客户端代码需要稍微小心以避免切片,而对于注入,则MyReader
本身在存储/复制时需要稍微小心,但是至少是集中式的因此更容易获得和保持正确
CRTP是另一种选择,具有编译时解析和优化(消除死代码,内联等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.