-
Notifications
You must be signed in to change notification settings - Fork 0
Home
jijinlong edited this page Nov 14, 2016
·
15 revisions
##C++依赖注入实现 我们的目标就是 能够影藏具体的实现,并且可以抽选相关的实现,使用时只约定接口即可。
IAction action; // 定义的接口 action.imp("ActionImp"); // 选择相关的实现,在配置文件中通过ActionImp 抽选相关的实现为action赋值 action->doSometing(); //注意这里的-> 他是会调用的具体实现的方法
怎么能做到这点呢?我们一步步来,先实现基础的Interface类
template<typename T> class Interface { public: T * operator->() // 重载-> 调用子类相关函数 { if (_buffer == 0) return 0; return static_cast<T*>((void*)_buffer); } Interface() { _buffer = 0; } virtual ~Interface() { if (_buffer) delete static_cast<T*>((void*)_buffer); // 注意并不是直接delete _buffer ,若是将无法调用实现的析构 _buffer = 0; } protected: void* _buffer; // 具体实现类 所使用 的空间 };
为什么不用 纯虚函数呢? 对象在使用时必须有实现,不然C++无法分配内存,所有必须是个包含空实现的虚函数来做,我们是需要在运行期指定实现的。我们定义IAction 来继承Interface 类,Interface类帮我们实现了->重载 可以让C++为我们自动调用实现类的方法。
class IAction:public Interface<IAction> { public: virtual void doSometing(){}; // 空实现 必须是虚函数 };