繁体   English   中英

注入与继承

[英]Injection vs. Inheritance

我有一个类,它从文件中读取一些数据,然后将其解码。

我正在尝试使类尽可能通用,即我希望它能够解码任何类型的数据。

解码器本身是一个通用接口。

我看到2个选项:

  1. 注入-在构造函数中获取正确的解码器作为参数

    MyReader(Decoder <T>解码器){_decoder =解码器}

  2. 继承-提供将返回正确解码器的虚拟方法

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM