根据http://www.thinkbottomup.com.au/site/blog/C%20%20_Mixins_-_Reuse_through_inheritance_is_good
但是等一下,这一切都没有帮助我们插入我们的任务 管理器框架作为类不实现ITask接口。 这是一个最终的Mixin帮助的地方 - 一个引入的Mixin ITask接口进入继承层次结构,充当适配器 在某些类型T和ITask接口之间:
template< class T > class TaskAdapter : public ITask, public T { public: virtual void Execute() { T::Execute(); } virtual std::string GetName() { return T::GetName(); } };
使用TaskAdapter很简单 - 它只是链中的另一个链接 mixins。
// typedef for our final class, inlcuding the TaskAdapter<> mixin typedef public TaskAdapter< LoggingTask< TimingTask< MyTask > > > task; // instance of our task - note that we are not forced into any heap allocations! task t; // implicit conversion to ITask* thanks to the TaskAdapter<> ITask* it = &t; it->Execute();
TaskAdapter
实施ITask
时,为什么需要MyTask
?如果ITask
不是抽象的,也可能导致钻石问题。
答案 0 :(得分:4)
这是一篇非常酷炫有趣的文章。
在最后的Mixin示例中,MyTask
类来自ITask
。这意味着它不能被强制转换为最终完成的ITask
指针。
在该示例中,我相信您可以从MyTask
派生ITask
。但我认为作者希望说明您甚至可以使用MyTask
来解除TaskAdapter
课程。